具有多个 return 值的模拟 python 函数
Mock python function with multiple return values
我有一个 python 函数,可以 return 乘以值。我的函数:
def myExampleFunction(a,b)
# here is my code
return name, number1, number2
def FunctionIWantToTest(self):
# here is my code
myName, myNumber1, myNumber2 = self.myExampleFunction(a,b)
我想将我自己的值赋予 FunctionIWantToTest 中的 returned 值。所以,我正在尝试用 nosetest 测试第二个函数,但我不知道如何模拟 myExampleFunction 的 return。
我试过这个:
def test_mytest(self):
[...]
c.myExampleFunction = Mock()
c.myExampleFunction.side_effect = ["myName", 100, 200]
[...]
但是没用。当我启动 nosetests 时,我看到这条消息:
ValueError: too many values to unpack
有什么想法吗?我用的是python 2.7.3
你需要设置mock的return_value
,而不是side_effect
。
你可以在实例化的时候这样做:
c.myExampleFunction = Mock(return_value=["myName", 100, 200])
只是想分享如何让它与 side_effect
一起工作。我整理了一个简化版本来展示如何将 side_effect
用于您的用例。
side_effect
的行为与 return_value 不同,当您为 side_effect
提供一个包含条目的列表时,您实际上说的是,每次调用您的模拟方法时它将 return 列表中的每个项目作为其 return 值。这实际上就是你得到 ValueError: too many values to unpack (expected 3) 的原因,因为这样做:
[1, 2, 3]
你是说,每次调用我的模拟方法,return 1,然后我下次调用该方法时,return 2,然后 return 3。
考虑到这一点,如果您设置 side_effect
,如下所示:
[('stuff1', 'stuff2', 'stuff3')]
您现在说的是,当您调用 side_effect 时,列表中的第一项就是 return 编辑的内容。实际上是:
('stuff1', 'stuff2', 'stuff3')
或者,您可以这样做:
my_test_foo.side_effect = lambda x, y: (1, 2, 3)
它通过采用两个参数和 return 应该 return 的三个值来模拟您正在测试的方法。
因此,考虑到这一点,您的测试可以构造为:
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()
我有一个 python 函数,可以 return 乘以值。我的函数:
def myExampleFunction(a,b)
# here is my code
return name, number1, number2
def FunctionIWantToTest(self):
# here is my code
myName, myNumber1, myNumber2 = self.myExampleFunction(a,b)
我想将我自己的值赋予 FunctionIWantToTest 中的 returned 值。所以,我正在尝试用 nosetest 测试第二个函数,但我不知道如何模拟 myExampleFunction 的 return。
我试过这个:
def test_mytest(self):
[...]
c.myExampleFunction = Mock()
c.myExampleFunction.side_effect = ["myName", 100, 200]
[...]
但是没用。当我启动 nosetests 时,我看到这条消息:
ValueError: too many values to unpack
有什么想法吗?我用的是python 2.7.3
你需要设置mock的return_value
,而不是side_effect
。
你可以在实例化的时候这样做:
c.myExampleFunction = Mock(return_value=["myName", 100, 200])
只是想分享如何让它与 side_effect
一起工作。我整理了一个简化版本来展示如何将 side_effect
用于您的用例。
side_effect
的行为与 return_value 不同,当您为 side_effect
提供一个包含条目的列表时,您实际上说的是,每次调用您的模拟方法时它将 return 列表中的每个项目作为其 return 值。这实际上就是你得到 ValueError: too many values to unpack (expected 3) 的原因,因为这样做:
[1, 2, 3]
你是说,每次调用我的模拟方法,return 1,然后我下次调用该方法时,return 2,然后 return 3。
考虑到这一点,如果您设置 side_effect
,如下所示:
[('stuff1', 'stuff2', 'stuff3')]
您现在说的是,当您调用 side_effect 时,列表中的第一项就是 return 编辑的内容。实际上是:
('stuff1', 'stuff2', 'stuff3')
或者,您可以这样做:
my_test_foo.side_effect = lambda x, y: (1, 2, 3)
它通过采用两个参数和 return 应该 return 的三个值来模拟您正在测试的方法。
因此,考虑到这一点,您的测试可以构造为:
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()