pythonmock-如何像返回普通方法一样返回MagicMock
例如:pythonmock-如何像返回普通方法一样返回MagicMock,python,unit-testing,mocking,python-unittest,python-mock,Python,Unit Testing,Mocking,Python Unittest,Python Mock,例如: 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.assertEqu
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对象来获取测试的返回,这个测试应该是一个包含3个元素的元组,并且不多或少
任何建议、任何想法、任何争论都将受到欢迎。
提前谢谢 如果您试图测试
MyClass.foo()
是否正常工作,则不应模拟它
模拟用于测试代码之外的任何;如果foo
调用了另一个外部函数some\u module.bar()
,那么您将模拟some\u 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\u bar.return\u value
设置为调用mockedsome\u module.bar()
函数时应该返回的值。当被测代码实际调用bar()
时,模拟将返回该值
如果不设置
return\u值
将返回一个新的MagicMock()
对象,该对象将支持进一步的调用,并且您可以像在mock\u条
对象等上一样测试这些调用。您是否尝试测试MyClass.foo()
是否正常工作?因为你不应该嘲笑它。这个问题的想法是知道如何获得测试的返回,而不是MagicMock对象,因为我会在不同的场景中应用它。有些测试表明,我需要的是返回的值,而不是MagicMock对象;模拟其他内容但设置返回值的示例。如果您真的想模拟MyClass.foo()
,那么您的示例过于冗长(并且不正确,在def TestMyClass()
上没有self
)。在任何情况下,您都直接调用mock,而原始的MyClass.foo()
从未被调用,因为它已被mock替换。不需要显式调用类,甚至不需要实例化它。模拟图书馆让一切变得神奇。不知何故,按照上面的示例代码,在运行测试之后,foo_mock将只被称为
。我将根据您的答案尝试一些东西。自愿的,我会对发生的事情给出反馈。谢谢这里到底在测试什么?您有一个mock方法,您知道它返回什么MyClass.foo()
还将所有内容传递给某个模块.bar()
。那么在什么情况下这可能会失败呢?你在测试什么?@norbertpy,这里MyClass.foo
方法是单元测试的。如果在MyClass.foo
方法中执行了一些不正确的操作,例如,plus
操作与乘法
错误放置,则此测试将失败。