python检查是否调用了一个方法而不嘲笑它

cla*_*ius 7 python unit-testing mocking python-3.x magicmock

class A():
    def tmp(self):
        print("hi")

def b(a):
    a.tmp()
Run Code Online (Sandbox Code Playgroud)

要检查是否在b中调用了tmp方法,推荐的方法是

a = A()
a.tmp = MagicMock()
b(a)
a.tmp.assert_called()
Run Code Online (Sandbox Code Playgroud)

但是这里的tmp被嘲笑了,并没有导致"hi"被打印出来。

我希望我的单元测试可以检查方法tmp是否被调用而不会模拟它。

这可能吗?

我知道在编写unitest时这不是标准的事情。但是我的用例(有点棘手)需要这样做。

Pat*_*ugh 7

您可以将设置Mock.side_effect为原始方法。

from unittest.mock import MagicMock

class A():
    def tmp(self):
        print("hi")

def b(a):
    a.tmp()

a = A()
a.tmp = MagicMock(side_effect=a.tmp)
b(a)
a.tmp.assert_called()
Run Code Online (Sandbox Code Playgroud)

when side_effect是一个函数(或在这种情况下为绑定方法,这是一种函数),调用Mock还将side_effect使用相同的参数调用。

Mock()调用将返回无论side_effect回报,除非它返回的unnittest.mock.DEFAULT单。然后它将返回Mock.return_value