我正在测试一个对象的行为。在下面的示例代码中,我检查是否调用方法bar2
。
调试打印显示是,bar2
被调用。不幸的是,mock
- 库不会跟踪此调用。
如何让mock
注意到这种“内部”通话?
import mock
class Foo:
def bar1(self):
print "in bar1"
self.bar2()
def bar2(self):
print "in bar2"
m = mock.Mock(wraps = Foo())
m.bar1()
print "Method calls:", m.method_calls
m.bar2.assert_called_with()
输出:
in bar1
in bar2
Method calls: [call.bar1()]
...
AssertionError: Expected call: bar2()
Not called
更新
我已经接受了补丁作为有条不紊的方法,但也想表明我的直接方法:
obj = Foo()
m = mock.Mock(wraps = obj)
obj.bar2 = m.bar2 # Patch the object manually
m.bar1()
m.bar2.assert_called_with()
答案 0 :(得分:4)
你不是。你嘲笑Foo()
,所以实施已经消失;嘲笑的全部意义在于取代阶级。
如果您正在测试Foo
本身,请不要嘲笑该课程。您可以改为模拟单个方法:
with mock.patch('__main__.Foo.bar2') as bar2_mock:
f = Foo()
f.bar1()
print "Method calls:", bar2_mock.method_calls
bar2_mock.assert_called_with()
输出:
in bar1
Method calls: []
现在只有bar2
被嘲笑了。