您如何使python模拟与导入A和从导入B一起工作

时间:2019-07-08 09:10:37

标签: python mocking

在python中,使用来模拟对象

@patch('foo.bar')
def test_things(self, bar):
    bar.return_value= ...

要求所有经过测试的类都使用

import foo

并且不能使用

from foo import bar

在第二种情况下,被测试的代码使用原始对象作为模拟patches names,而不是函数本身。感觉很脆。

我们如何编写适用于两种导入形式的模拟?

1 个答案:

答案 0 :(得分:0)

简短答案:否

mock的原理是模拟一个对象。如果您以不同的方式在代码中导入同一对象(这有点怪异),则需要为每个对象创建一个模拟。

示例:

import os
from os.path import isdir

from unittest.mock import patch

>>> with patch('os.path') as mock_os_path:
...     mock_os_path.isdir.return_value = "Hello"
...     mocked_res = os.path.isdir("./")
...     res = path.isdir("./")
...     print("mocked_res)
...     print(res)
... 
Hello
True

根据docs

  

target应该是“ package.module.ClassName”形式的字符串。导入目标并将指定的对象替换为新对象,因此目标必须可从您从其调用patch()的环境中导入。在执行装饰功能时(而不是在装饰时)导入目标。