模拟类函数应该被调用一次但 call_count == 0?

我有以下mod1.py要测试的。


_p = None


def get_p():

    global _p

    if _p is None:

        _p = P()

    return _p


def deco(f):

    p = get_p()

    def wrapper(*args, **kwargs):

        p.func1()

        return f(*args, **kwargs)

    return wrapper

并且P,


class P:

    def func1(self):

        pass

我有以下测试代码。


@mock.patch('mod1.get_p')

def test_1(mocked):

    mocked.get_p = mock.Mock(P) 


    @mod1.deco()

    def test():

        pass


    test() # will call _p.func1() once


    assert mocked.func1.call_count == 1 # func1.count_count is zero

然而,它失败了


>       assert p.func1.call_count == 1

E       AssertionError: assert 0 == 1

为什么call_count是0?


森林海
浏览 70回答 1
1回答

米琪卡哇伊

为什么代码不起作用通常,您会收到 0 次调用,因为您的装饰器不会调用_p.func1.您不必编写,mocked.get_p因为您已经伪造了它,因此您的mocked参数代表mod.get_p函数。另外,您不应该重新定义mocked变量,因为它已经是mock.Mock如果mod1你有错误,你的deco装饰器是错误的,我建议你阅读更多关于 python 装饰器的内容。适用于您的案例的工作代码mod1.pyclass P:    def func1(self):        pass_p = Nonedef get_p():    global _p    if _p is None:        _p = P()    return _p # other code omitted, it's a decorator which will call _p.func1 oncedef deco(func):    def wrapper(*args, **kwargs):        p = get_p()        p.func1()        return func(*args, **kwargs)    return wrappertest_mod1.pyimport unittestfrom unittest import mockimport mod1class TestFunc1(unittest.TestCase):    @mock.patch('mod1.get_p')    def test_1(self, mocked):        _p_mock = mock.Mock()        mocked.return_value = _p_mock        @mod1.deco        def test():            pass        test()        _p_mock.func1.assert_called_once()if __name__ == '__main__':    unittest.main()在 openSUSE Tumbleweed、Python3.8.5 上运行:> python test_mod1.py.----------------------------------------------------------------------Ran 1 test in 0.001sOK
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python