Django 信号中未调用 MagicMock
MagicMock not called inside django signals
我有一些模型
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
的范围有关;但是,我不确定如何修复它。
您的问题可能出在这一行:
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 部分。
我有一些模型
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
的范围有关;但是,我不确定如何修复它。
您的问题可能出在这一行:
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 部分。