为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森林海 2023-10-11 15:56:28
我有以下mod1.py要测试的。_p = Nonedef get_p():    global _p    if _p is None:        _p = P()    return _pdef 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 == 1E       AssertionError: assert 0 == 1为什么call_count是0?
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

为什么代码不起作用


通常,您会收到 0 次调用,因为您的装饰器不会调用_p.func1.


您不必编写,mocked.get_p因为您已经伪造了它,因此您的mocked参数代表mod.get_p函数。


另外,您不应该重新定义mocked变量,因为它已经是mock.Mock


如果mod1你有错误,你的deco装饰器是错误的,我建议你阅读更多关于 python 装饰器的内容。


适用于您的案例的工作代码


mod1.py


class P:

    def func1(self):

        pass



_p = None


def get_p():

    global _p

    if _p is None:

        _p = P()

    return _p


 # other code omitted, it's a decorator which will call _p.func1 once

def deco(func):

    def wrapper(*args, **kwargs):

        p = get_p()

        p.func1()

        return func(*args, **kwargs)

    return wrapper

test_mod1.py


import unittest

from unittest import mock


import mod1


class 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.001s


OK


查看完整回答
反对 回复 2023-10-11
  • 1 回答
  • 0 关注
  • 42 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信