有没有一种干净的方法来修补一个对象,以便在测试用例中获得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
来解决这个问题,但我希望有一种更好的方法,可以在所有函数,类方法,静态方法,未绑定方法等上以相同的方式工作。
6条答案
按热度按时间b91juud31#
与您的解决方案类似,但使用
wraps
:根据the documentation:
1szpjjfi2#
这个答案解决了用户Quuxplusone的赏金中提到的额外要求:
对于我的用例来说,重要的是它可以与
@patch.mock
一起工作,即在构造Potato
示例(本例中为spud
)和调用spud.foo
之间不需要插入任何代码。我需要从一开始就使用mocked-outfoo
方法创建spud
,因为我不控制创建spud
的位置。上面描述的用例可以通过使用装饰器来实现,没有太多麻烦:
如果replaced方法接受在测试中修改的可变参数,您可能希望初始化一个
CopyingMock
* 来代替spy_decorator中的MagicMock
。rjee0c153#
对于那些不介意使用
side_effect
的人,这里有一个具有一些优点的解决方案:aij0ehis4#
您正在描述与Python mock: wrap instance method相同的问题。我在https://stackoverflow.com/a/72446339/9230828中的解决方案可以应用如下:把
wrap_object
放在某个地方,例如wrap_object.py
:然后你可以编写以下单元测试:
m3eecexj5#
我做了一个有点另一种方式,因为海事组织嘲笑是更可取的修补
uqjltbpv6#
这似乎也适用于
mock.patch
。假设我有这个模块my_mod.py
我想验证my_func是否被调用以及它的调用方式,但我不想更改它的行为。
我可以在模拟中使用 Package 。补丁似乎。