首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MagicMock作为自己的返回值?

使用MagicMock作为自己的返回值?
EN

Stack Overflow用户
提问于 2018-08-20 22:24:54
回答 1查看 67关注 0票数 1

通常,MagicMock为它上调用的任何属性或方法返回新的MagicMocks:

代码语言:javascript
复制
>>> mm = MagicMock()
>>> mm
<MagicMock id='140094558921616'>
>>> mm()
<MagicMock name='mock()' id='140094551215016'>
>>> mm.foo()
<MagicMock name='mock.foo()' id='140094551605656'>

最近,我一直在编写用于返回模拟类上所有方法和属性的相同模拟的补丁:

代码语言:javascript
复制
>>> mm = MagicMock()
>>> mm.return_value = mm
>>> mm.foo.return_value = mm
>>> mm
<MagicMock id='140094551638984'>
>>> mm()
<MagicMock id='140094551638984'>
>>> mm.foo()
<MagicMock id='140094551638984'>

这是很方便的,因为我的工具可以简单地产生这个单一的模拟,并且可以针对它运行多个断言。我没有看到任何缺点:calledcall_countcall_args属性继续对每个模拟属性准确地工作。

然而,MagicMock并没有以这种方式发挥作用,这让我觉得我可能错过了什么。

这主意不好吗?

EN

回答 1

Stack Overflow用户

发布于 2022-04-15 12:06:08

MagicMock无法以这种方式工作的原因是,测试不能再区分对模拟本身的调用和对模拟返回值的调用。下面是设计的模拟行为:我们可以区分使用参数5调用模拟本身,然后用参数6调用它返回的对象。

代码语言:javascript
复制
from unittest.mock import MagicMock
m = MagicMock()

r = m(5)
r(6)

print(m.call_args_list)
print(r.call_args_list)

输出:

代码语言:javascript
复制
[call(5)]
[call(6)]

如果我们将模拟设置为自己的返回值,那么测试将不再区分这两者。测试可以看到进行了两个调用,并且可以看到这两个参数,但无法判断调用是对m本身还是对第一个调用的返回值r

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
[call(5), call(6)]
[call(5), call(6)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51939265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档