python检查是否调用了一个方法,而不模仿它

2024-09-28 21:35:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

def b(a):
    a.tmp()

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

^{pr2}$

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

我想让我的单元测试检查是否调用了tmp方法,而不去模仿它。在

这可能吗?在

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


Tags: 方法self标准def单元测试hi用例tmp
2条回答

您可以将^{}设置为原始方法。在

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()

side_effect是一个函数(或在本例中是一种函数的绑定方法)时,调用Mock也将使用相同的参数调用{}。在

Mock()调用将返回side_effect返回的任何内容,除非它返回^{}单例。然后它将返回^{}。在

或者您可以装饰测试方法:

def check_called(fun):
    def wrapper(self, *args, **kw):
        attrname = "_{}_called".format(fun.__name__)
        setattr(self, attrname, True)
        return fun(self, *args, **kw)
    return wrapper


a = A()
a.tmp = check_called(a.tmp)
b(a)
assert(getattr(a, "_tmp_called", False))

但是如果您已经在使用Mock,MagicMock的side_effect无疑是一个更好的解决方案;)

相关问题 更多 >