python模拟-在不妨碍实现的情况下修补方法
有没有一种干净的方法来修补对象,以使您的assert_call*
助手获得测试用例的帮助,而无需实际删除操作?
例如,如何修改该@patch
行以通过以下测试:
from unittest import TestCase
from mock import patch
class Potato(object):
def foo(self, n):
return self.bar(n)
def bar(self, n):
return n + 2
class PotatoTest(TestCase):
@patch.object(Potato, 'foo')
def test_something(self, mock):
spud = Potato()
forty_two = spud.foo(n=40)
mock.assert_called_once_with(n=40)
self.assertEqual(forty_two, 42)
我可能会使用一起破解side_effect
,但是我希望有一种更好的方法可以在所有函数,类方法,静态方法,未绑定方法等上以相同的方式工作。
-
与您类似的解决方案,但使用
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)