通常,MagicMock为它上调用的任何属性或方法返回新的MagicMocks:
>>> mm = MagicMock()
>>> mm
<MagicMock id='140094558921616'>
>>> mm()
<MagicMock name='mock()' id='140094551215016'>
>>> mm.foo()
<MagicMock name='mock.foo()' id='140094551605656'>最近,我一直在编写用于返回模拟类上所有方法和属性的相同模拟的补丁:
>>> mm = MagicMock()
>>> mm.return_value = mm
>>> mm.foo.return_value = mm
>>> mm
<MagicMock id='140094551638984'>
>>> mm()
<MagicMock id='140094551638984'>
>>> mm.foo()
<MagicMock id='140094551638984'>这是很方便的,因为我的工具可以简单地产生这个单一的模拟,并且可以针对它运行多个断言。我没有看到任何缺点:called、call_count和call_args属性继续对每个模拟属性准确地工作。
然而,MagicMock并没有以这种方式发挥作用,这让我觉得我可能错过了什么。
这主意不好吗?
发布于 2022-04-15 12:06:08
MagicMock无法以这种方式工作的原因是,测试不能再区分对模拟本身的调用和对模拟返回值的调用。下面是设计的模拟行为:我们可以区分使用参数5调用模拟本身,然后用参数6调用它返回的对象。
from unittest.mock import MagicMock
m = MagicMock()
r = m(5)
r(6)
print(m.call_args_list)
print(r.call_args_list)输出:
[call(5)]
[call(6)]如果我们将模拟设置为自己的返回值,那么测试将不再区分这两者。测试可以看到进行了两个调用,并且可以看到这两个参数,但无法判断调用是对m本身还是对第一个调用的返回值r。
from unittest.mock import MagicMock
m = MagicMock()
m.return_value = m
r = m(5)
r(6)
print(m.call_args_list)
print(r.call_args_list)输出:
[call(5), call(6)]
[call(5), call(6)]https://stackoverflow.com/questions/51939265
复制相似问题