如何使用模拟库修补Python类

2024-04-26 04:11:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我在为我的测试打补丁时遇到了麻烦。我正在尝试修补属于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'

结果是:

^{pr2}$

此示例与模拟库教程中的示例几乎相同。知道为什么不起作用吗?在


Tags: instancefromimport示例returnfoovalueexample
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()的形式调用方法。在

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

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

有关详细信息,请参见where to patch。在

编辑如果您确实需要这样做,您可以使用以下内容修补当前模块中的类:

^{pr2}$

相关问题 更多 >

    热门问题