在Python中模拟保留其功能的对象

时间:2016-10-17 10:04:47

标签: python unit-testing mocking

我正在测试一个对象的行为。在下面的示例代码中,我检查是否调用方法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()

1 个答案:

答案 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被嘲笑了。