我在为考试补课时遇到困难。我正在尝试修补属于scrapy-aHtmlXpathSelector类的东西。
下面是一些代码:

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
>>>

这个示例与模拟库教程中的示例几乎相同。知道为什么没用吗?

最佳答案

不应修补当前测试代码中已导入的类。相反,您需要修补相应模块中的类(您需要测试)因此,如果在HtmlXPathSelector中导入mymodule,您将修补为:

with patch('mymodule.HtmlXPathSelector') as MockClass:
    ...

有关详细信息,请参见where to patch
编辑如果您真的需要,可以使用以下命令修补当前模块中的类:
with patch('__main__.Class') as MockClass:

10-08 18:48