只是想分享一下如何让它与side_effect一起工作。我整理了一个简化版本来展示如何为您的用例使用side_effect。
side_effect的行为与返回值不同,在返回值中,当您为带有条目的列表提供一个side_effect时,您实际上声明的是,每次调用模拟方法时,它都将返回列表中的每个项作为其返回值。这就是您获得ValueError的原因:要解包的值太多(应为3),因为执行此操作:[1, 2, 3]
你是说,每次调用我的模拟方法时,返回1,然后下次调用该方法时,返回2,然后返回3。
考虑到这一点,如果您设置side_effect,如下所示:[('stuff1', 'stuff2', 'stuff3')]
你现在要说的是,当你调用side_effect时,列表中的第一项是将返回的内容。实际上是:('stuff1', 'stuff2', 'stuff3')
或者,您可以执行以下操作:my_test_foo.side_effect = lambda x, y: (1, 2, 3)
它通过获取两个参数并返回它应该返回的三个值来模拟您正在测试的方法。
因此,考虑到这一点,您的测试可以构造为:import unittest
from unittest.mock import Mock
from mock import patch
from stuff import FunctionIWantToTest
class MyTest(unittest.TestCase):
@patch('stuff.myExampleFunction', return_value=Mock())
def test_mytest(self, m_example_function):
m_example_function.side_effect = [("stuff1", 100, 200)]
# m_example_function.side_effect = lambda x, y: ("stuff1", 100, 200)
a, b, c = FunctionIWantToTest()
if __name__ == '__main__':
unittest.main()