首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让MagicMock返回多个值

如何让MagicMock返回多个值
EN

Stack Overflow用户
提问于 2019-03-15 05:52:25
回答 2查看 2.1K关注 0票数 2

我正在尝试模拟一个库(matplotlib就是它的价值),并且遇到了一个问题,当模拟被调用并期望返回一个元组时,它会失败。有没有更好的方法来做这件事?

代码语言:javascript
复制
Python 3.7.2 (default, Jan 13 2019, 12:50:15) 
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin

>>> import mock
>>> foo = mock.MagicMock()
>>> a, b = foo()

这是收到的错误消息:

代码语言:javascript
复制
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 2, got 0)
>>> 
EN

回答 2

Stack Overflow用户

发布于 2019-03-15 06:05:07

您可以使用您选择的元组设置MagicMock对象的return_value属性:

代码语言:javascript
复制
import mock
foo = mock.MagicMock()
foo.return_value = 1, 2
a, b = foo()
assert a == 1
assert b == 2
票数 0
EN

Stack Overflow用户

发布于 2021-05-12 05:46:15

(对于那些对一个模拟返回不同的不同值感到好奇的人,请参阅下面答案末尾的side_effect用法。)

我将从你问题中的第一个陈述开始:

我正在尝试模拟一个库(matplotlib是值得的)

如果你能够正确地模拟这个库,你就不必担心任何子函数的行为-因为它们都会被模拟,你可以确定被模拟的函数应该如何表现。我是如何通过使用patch来实现类似的行为的--具体地说,patch.object应该会有所帮助:

代码语言:javascript
复制
import mock

mock_matplotlib = mock.MagicMock()
mock_matplotlib.return_value = whatever_mock_behavior_you_want

with mock.patch.object(my_app, "matplotlib", mock_matplotlib):
    # Call the function you are testing which uses matplotlib

现在,您可以自由地将mock_matplotlib替换为您喜欢的任何内容,这样它就可以按照您所寻求的方式运行。(例如,mock_matplotlib.return_value = mock_tuple)让我们来探索其中的一些可能性。

you mentioned认为MagicMock总是为在它上面调用的任何东西返回一个MagicMock时,你是正确的-然而,使用a, b = foo()的语句,Python期望找到一个元组,并且在MagicMock可以创建默认的单个MagicMock返回值之前触发了错误,所以错误表明它找到了要处理的0值。

您的创建MagicMock元组的解决方案可以通过许多不同的方式工作-从您的问题看,使用a, b =赋值对您来说是否更重要并不清楚。如果是,那么您可以这样做:

代码语言:javascript
复制
import mock
foo = mock.MagicMock()
a, b = (mock.MagicMock(), mock.MagicMock())

或者这样:

代码语言:javascript
复制
a, b = (foo(), foo())

或者,如果您更感兴趣的是让一个函数调用为您填充这些值,您可以像这样分配一个return_value

代码语言:javascript
复制
foo = mock.MagicMock()
foo.return_value = (mock.MagicMock(), mock.MagicMock())
a, b = foo()

或者甚至像这样:

代码语言:javascript
复制
foo = mock.MagicMock(return_value=(mock.MagicMock(), mock.MagicMock()))
a, b = foo()

对于那些对this comment感兴趣的人来说,OP是正确的,它不同于每次调用MagicMock时返回不同的值。这将使用side_effect选项-然而,即使是这样也可以用来实现OP的目标-尽管是以一种间接的方式:

代码语言:javascript
复制
mock_1 = mock.MagicMock()
mock_2 = mock.MagicMock()
foo = mock.MagicMock(side_effect=[mock_1, mock_2])

a, b = (foo(), foo())

在最后一个示例中,mock_1被分配给amock_2被分配给b

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55172582

复制
相关文章

相似问题

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