1

我有一些模型

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。但是,我不确定如何解决它。

4

1 回答 1

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:

有关更多信息,请参阅文档中的 修补位置部分。

于 2016-11-22T05:33:57.267 回答