例如:
import mock
class MyClass(object):
def foo(self, x, y, z):
return (x, y, z)
class TestMyClass(TestCase)
@mock.patch('MyClass')
def TestMyClass(self, MyClassMock):
foo_mock = MyClassMock.foo()
self.assertEquals((x, y, z), foo_mock)
因此,真正的问题是:如何获得该测试的返回值而不是获得此 <MagicMock name='MyClass.foo()' id='191728464'>
或者如何处理这个 MagicMock 对象以获得该测试的返回值,该测试应该是一个包含 3 个元素的元组,不多也不少?
任何建议、任何想法、任何争论都将受到欢迎。 提前致谢!
最佳答案
如果您尝试测试 MyClass.foo()
是否正常工作,您不应该模拟它。
模拟用于被测代码之外的任何事物;如果 foo
调用了另一个外部函数 some_module.bar()
,那么您将模拟 some_module.bar()
并给它分阶段返回值:
import some_module
class MyClass(object):
def foo(self, x, y, z):
result = some_module.bar(x, y, z)
return result[0] + 2, result[1] * 2, result[2] - 2
class TestMyClass(TestCase):
@mock.patch('some_module.bar')
def test_myclass(self, mocked_bar):
mocked_bar.return_value = (10, 20, 30)
mc = MyClass()
# calling MyClass.foo returns a result based on bar()
self.assertEquals(mc.foo('spam', 'ham', 'eggs'),
(12, 40, 28))
# some_class.bar() was called with the original arguments
mocked_bar.assert_called_with('spam', 'ham', 'eggs')
在这里,我将 mocked_bar.return_value
设置为调用模拟的 some_module.bar()
函数时应返回的值。当被测代码实际调用 bar()
时,模拟会返回该值。
当您不设置return_value
时,将返回一个新 MagicMock()
对象,该对象将支持进一步的调用,您可以像在 mocked_bar
对象上一样测试这些调用,等等。
关于Python Mock - 如何像普通方法一样返回 MagicMock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21611595/