gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:30:40 25 4
gpt4 key购买 nike

我正在使用 Python 模拟模块进行测试。我想监视事件对象进行的内部方法调用。我发现 'wraps' kwarg 可以用来设置一个模拟来监视对事件对象的方法调用:

Using Python mock to spy on calls to an existing object

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

给定:

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”参数更高()绑定(bind)到原始 DUT 对象,而不是 mock_DUT spy 。因此只有最初的 higher() 调用被记录到 mock_calls。有没有一种方便的方法可以使用 python mock 模块执行这种断言?

最佳答案

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

您可以使用 Mock(spec=obj) 构造函数构造一个“ spy ”,这将使 __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()]

关于python - 使用 Python Mock 库监视内部方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20952239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com