3

我无法为我的测试修补课程。我正在尝试修补属于 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 库教程中的示例几乎相同。知道为什么它不起作用吗?

4

2 回答 2

7

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

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

有关更多详细信息,请参阅修补位置

编辑如果你真的需要这个,你可以在当前模块中修补一个类:

with patch('__main__.Class') as MockClass:
于 2012-06-22T11:45:11.373 回答
2

您的代码示例存在两个问题。第一个是您已经从 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()

于 2012-06-22T12:01:05.123 回答