我正在尝试模拟一个库(matplotlib就是它的价值),并且遇到了一个问题,当模拟被调用并期望返回一个元组时,它会失败。有没有更好的方法来做这件事?
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()这是收到的错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 2, got 0)
>>> 发布于 2019-03-15 06:05:07
您可以使用您选择的元组设置MagicMock对象的return_value属性:
import mock
foo = mock.MagicMock()
foo.return_value = 1, 2
a, b = foo()
assert a == 1
assert b == 2发布于 2021-05-12 05:46:15
(对于那些对一个模拟返回不同的不同值感到好奇的人,请参阅下面答案末尾的side_effect用法。)
我将从你问题中的第一个陈述开始:
我正在尝试模拟一个库(
matplotlib是值得的)
如果你能够正确地模拟这个库,你就不必担心任何子函数的行为-因为它们都会被模拟,你可以确定被模拟的函数应该如何表现。我是如何通过使用patch来实现类似的行为的--具体地说,patch.object应该会有所帮助:
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 =赋值对您来说是否更重要并不清楚。如果是,那么您可以这样做:
import mock
foo = mock.MagicMock()
a, b = (mock.MagicMock(), mock.MagicMock())或者这样:
a, b = (foo(), foo())或者,如果您更感兴趣的是让一个函数调用为您填充这些值,您可以像这样分配一个return_value:
foo = mock.MagicMock()
foo.return_value = (mock.MagicMock(), mock.MagicMock())
a, b = foo()或者甚至像这样:
foo = mock.MagicMock(return_value=(mock.MagicMock(), mock.MagicMock()))
a, b = foo()对于那些对this comment感兴趣的人来说,OP是正确的,它不同于每次调用MagicMock时返回不同的值。这将使用side_effect选项-然而,即使是这样也可以用来实现OP的目标-尽管是以一种间接的方式:
mock_1 = mock.MagicMock()
mock_2 = mock.MagicMock()
foo = mock.MagicMock(side_effect=[mock_1, mock_2])
a, b = (foo(), foo())在最后一个示例中,mock_1被分配给a,mock_2被分配给b。
https://stackoverflow.com/questions/55172582
复制相似问题