![](/img/trans.png)
[英]How to mock a python library using patch in python regardless where it is used?
[英]How to patch Python class using Mock library
我在为我的测试修补类时遇到问题。 我正在尝试修补属于 Scrapy 的东西——一个HtmlXpathSelector类。
这是一些代码:
from scrapy.selector import HtmlXPathSelector
from mock import MagicMock, patch
with patch('scrapy.selector.HtmlXPathSelector') as MockHtml:
instance = MockHtml.return_value
instance.method.return_value = 'foo'
example = HtmlXPathSelector()
print type(example)
assert example is instance
assert example.method == 'foo'
结果是:
<class 'scrapy.selector.lxmlsel.HtmlXPathSelector'>
Traceback (most recent call last):
File "<stdin>", line 6, in <module>
AssertionError
>>>
这个示例与 Mock 库教程中的示例几乎相同。 知道为什么它不起作用吗?
您不应修补已在当前测试代码中导入的类。 相反,您需要修补相应模块中的类(您要测试)。 因此,如果在mymodule
导入HtmlXPathSelector
,您将修补为:
with patch('mymodule.HtmlXPathSelector') as MockClass:
...
有关更多详细信息,请参阅修补位置。
编辑如果你真的需要这个,你可以在当前模块中修补一个类:
with patch('__main__.Class') as MockClass:
您的代码示例有两个问题。 第一个是您已经从 scrapy 模块导入了 HtmlXPathSelector,然后在事后更改了该名称。 改为导入选择器,并使用那里的名称:
from scrapy import selector
from mock import MagicMock, patch
with patch('scrapy.selector.HtmlXPathSelector') as MockHtml:
instance = MockHtml.return_value
instance.method.return_value = 'foo'
example = selector.HtmlXPathSelector()
print type(example)
assert example is instance
assert example.method() == 'foo'
另一个问题是你的最后一行是检查method
,当它需要调用方法作为method()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.