2016-11-22 7 views
1

у меня есть некоторые моделиMagicMock не вызывается внутри Джанго сигналов

class Foo(models.Model): 
    name = models.CharField(...) 
    url = models.URLField(...) 

foo_pre_save_(sender, instance, *args, **kwargs): 
    r = urlopen(instance.url)  # Magic mock is not called 
    html = bs4.BeautifulSoup(r.read(), "html5lib") 
    instance.name = html.find(name="title").text 

с тестом

def test_get_site_name(self): 
    with mock.patch('urllib.request.urlopen') as get_mock: 
     get_mock.return_value = mock_response = mock.MagicMock() 
     mock_response.read.return_value = "<title>facebook</title> 

     foo = Foo.objects.create(
       url = 'www.facebook.com' 
      ) 

    self.assertEqual(foo.name, "facebook") 

Но сигнал pre_save на самом деле происходит, и попав в комплект поставки URL, а не получать фиктивный ответ

Я считаю, что это связано с объемом patch; однако я не уверен, как это исправить.

ответ

0

Ваша проблема, скорее всего, эта линия:

with mock.patch('urllib.request.urlopen') as get_mock: 

Вы заплат имя, где определена функция, вместо того, где он импортируется. Попробуйте это:

# `myapp.models` is the module containing `Foo` 
with mock.patch('myapp.models.urlopen') as get_mock: 

Для получения дополнительной информации смотрите раздел where to patch в документации.