首页 > 解决方案 > 如何使 python 模拟同时使用 import A 和 from A import B

问题描述

在python中,使用模拟对象

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

要求所有测试的类都使用

import foo

并且不能使用

from foo import bar

在第二种情况下,被测代码使用原始对象作为模拟补丁名称而不是函数本身。这感觉很脆。

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

标签: pythonmocking

解决方案


简短的回答:没有

a 的原理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

根据文档

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


推荐阅读