如何在不模拟函数逻辑的情况下计算函数调用?

时间:2019-12-25 09:54:05

标签: python testing mocking

我想计算一个函数在测试中被调用的次数。 我无法保存原始函数对象以模拟函数,但仍然具有原始逻辑。原因是,该函数是从类的不同实例中调用的,这些实例是在函数本身中创建的。

例如:

class A(object):
    def do_something(self):
        new_instance = A()
        new_instance.do_something()
        ........

所以,我不能这样嘲笑:

from mock import patch

def test():
    instance = A()
    original_do_something = instance.do_something

    with patch('A.do_something', original_do_something) as do_something_mock:
        instance.do_something()
        assert do_something_mock.call_count == 5

这将以StackOverflow结尾,因为类A的所有不同实例将调用我创建的A的第一个实例的原始函数。它将继续创建将调用原始do_something的实例,并创建更多实例,等等。

有人知道一种在不改变逻辑的情况下对来自所有不同实例的do_something的所有函数调用进行计数的方法吗?

(Python 2.7)

谢谢!

1 个答案:

答案 0 :(得分:1)

有一个带有静态计数器的模拟类:

class AMock(A):
    count = 0

    def do_something(self):
        AMock.count += 1
        return super(AMock, self).do_something()

测试:

    from mock import patch

    def test():
        instance = A()
        original_do_something = instance.do_something

        with patch('A', AMock):
            instance.do_something()
            assert AMock.count == 5