与您类似的解决方案,但使用
wraps:
def test_something(self): spud = Potato() with patch.object(Potato, 'foo', wraps=spud.foo) as mock: forty_two = spud.foo(n=40) mock.assert_called_once_with(n=40) self.assertEqual(forty_two, 42)
根据文档:
wraps
:要包装的模拟对象的项目。如果wraps不为None,则调用Mock会将调用传递给包装的对象(返回实际结果)。对模拟的属性访问将返回一个Mock对象,该对象包装了包装对象的相应属性(因此,尝试访问不存在的属性将引发AttributeError)。
class Potato(object): def spam(self, n): return self.foo(n=n) def foo(self, n): return self.bar(n) def bar(self, n): return n + 2 class PotatoTest(TestCase): def test_something(self): spud = Potato() with patch.object(Potato, 'foo', wraps=spud.foo) as mock: forty_two = spud.spam(n=40) mock.assert_called_once_with(n=40) self.assertEqual(forty_two, 42)



