繁体   English   中英

使用Python Mock库监视内部方法调用

[英]Using Python Mock library to spy on internal method calls

我正在使用Python模拟模块进行测试。 我想监视由活动对象进行的内部方法调用。 我发现'wraps'kwarg可用于设置一个模拟,该模拟侦测对活动对象的方法调用:

使用Python mock监视对现有对象的调用

但这不适用于内部呼叫。 我想用它来测试更高级别的方法以正确的顺序调用低级方法。

鉴于:

class ClassUnderTest(object):
    def lower_1(self):
        print 'lower_1'

    def lower_2(self):
        print 'lower_2'

    def higher(self):
        self.lower_1()
        self.lower_2()

我想能够测试它

import mock

DUT = ClassUnderTest()
mock_DUT = mock.Mock(wraps=DUT)
# test call
mock_DUT.higher()

# Assert that lower_1 was called before lower_2
assert mock_DUT.mock_calls[1:] = [mock.call.lower_1(), mock.call.lower_2()]

这不起作用,因为'self'参数更高()绑定到原始DUT对象,而不是mock_DUT间谍。 因此,只有初始的high()调用被记录到mock_calls。 有没有一种方便的方法来使用python mock模块执行这种断言?

这有点像在Java中使用Mockito间谍。 http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html

您可以使用Mock(spec = obj)构造函数构造一个“间谍”,这将使__class__属性等于ClassUnderTest,其中Mock(wraps = obj)构造函数不会。 因为在python类方法中,将一个类实例self参数作为它们的第一个参数,你可以用mock来调用它,就像它是类上的静态方法一样。

import mock

DUT = ClassUnderTest()
spy = mock.Mock(spec=DUT)
# test call
ClassUnderTest.higher(spy)

# Assert that lower_1 was called before lower_2
assert spy.mock_calls == [mock.call.lower_1(), mock.call.lower_2()]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM