【发布时间】:2017-06-26 20:51:50
【问题描述】:
我想要什么:
确保在with 语句中创建的所有Foo 实例都将其foo 实例方法通过wraps=Foo.foo 包装在MagicMock 中。我想要这样做的原因是,我可以在 foo 方法上跟踪 call_count 创建的所有 Foo 实例。既然这么说,好像有点不可能……
>>> from mock import patch
...
... class Foo(object):
...
... def foo(self):
... return "foo"
...
... with patch("__main__.Foo.foo", wraps=Foo.foo) as m:
... foo = Foo()
... print(foo.foo())
Traceback (most recent call last):
File "a.py", line 12, in <module>
print(foo.foo())
File "/disk/software/lib/python27/mock/mock.py", line 1062, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/disk/software/lib/python27/mock/mock.py", line 1132, in _mock_call
return self._mock_wraps(*args, **kwargs)
TypeError: unbound method foo() must be called with Foo instance as first argument (got nothing instead)
问题
模拟的foo 方法没有绑定到通过foo = Foo() 创建的foo 实例,因为它包装了未绑定的方法Foo.foo。有谁知道如何确保模拟方法绑定到实例?
我已经知道的:
>>> foo = Foo()
... with patch.object(foo, "foo", wraps=foo.foo) as m:
... print(foo.foo())
"foo"
但这不满足我的约束,即对象必须在 patch 上下文中实例化。
【问题讨论】:
-
这是一个可行的方法,但它使用 try..finally 而不是模拟库:stackoverflow.com/questions/45584656/…
-
我只花了几个小时试图解决同样的问题。你有没有发现有用的东西? @guettli 的建议仍然依赖于处理实例,所以如果我的测试没有直接创建实例,它就没有帮助。
-
@Colin 在下面写了一个比较简单的解决方案。