python - 如何使用 Mock 库修补 Python 类

标签 python unit-testing mocking scrapy python-mock

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

最佳答案

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

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

参见 where to patch了解更多详情。

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

with patch('__main__.Class') as MockClass:

关于python - 如何使用 Mock 库修补 Python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11155210/

相关文章:

Python测试原始输入,if语句中的原始输入

Python Tkinter 随机生成颜色?

python - 我正在寻找在 python 中生成列表列表的组合

java - 模拟或构建 Jersey InboundJaxrsResponse

java - mock - 意外的期望 - 不知道我做错了什么

php - incallingMocker::with() 实际上做了什么?

python - Plone 将 Blob 数据迁移到 "bushy"布局 IOError Errno 21

python - 将python中混合数据类型对象中的数字转换为int/float,同时保持其余部分不变

unit-testing - Angular 2 - TestBed.configureTestingModule - 供应商 :[] throws Use of reserved word 'import' error

java - 可变输出 Mockito 模拟