亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

模擬類函數應該被調用一次但 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 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號