python - 如何使 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
在第二种情况下,被测代码使用原始对象作为模拟补丁名称而不是函数本身。这感觉很脆。
我们如何编写适用于两种导入形式的模拟?
解决方案
简短的回答:没有
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() 的环境中导入。目标是在执行装饰函数时导入的,而不是在装饰时。
推荐阅读
- reactjs - 单击按钮后 useState 计数器闪烁
- sql - 如何找到教过最多课程的人
- python - 如何旋转这个数据框?
- pandas - 如何将此 scikit-learn 部分转换为 pandas 数据框?
- html - 如何对具有相同值的 HTML 表进行分组(Javascript)
- python - 尝试使用curve_fit拟合3D高斯并获得广播问题(Python)
- arrays - 对具有相同元素和顺序的列表进行排序时结果不同
- python - FastAPI - 设置请求对象的 url 或路径
- reactjs - 你将如何为 React 输入框组件中的单个单词添加颜色?
- python - Python有多个参数值