簡體   English   中英

如何從 call_args_list 獲取傳遞給各種調用的 arguments?

[英]How to get the arguments passed to various calls from call_args_list?

我正在嘗試使用 call_args_list 在多次調用時將 arguments 傳遞給某個 function。 我正在使用這個:

call_args_list = mock.add_row.call_args_list

然后我得到一個如下所示的列表: [call('A', []), call('B', []), call('C', ['err'])]

如果我只想檢查第二個調用在第二個參數中沒有錯誤而第三個參數有錯誤,我需要以某種方式訪問調用中的項目。 有誰知道如何剝離這些調用對象以將項目放入其中?

它似乎沒有(很好)記錄,但mock定義了一個名為_Calltuple的子類,其實例是你在call_args_list看到的。 第一個元素是函數的名稱,第二個元素是位置參數的元組,第三個元素是關鍵字參數的字典。

import unittest

import mock


class TestCase(unittest.TestCase):
    def test_my_func(self):
        m = mock.MagicMock()
        m.add_row('A', [])
        m.add_row('B', [])
        m.add_row('C', ['err'])

        calls = m.add_row.call_args_list

        _first_arg, second_arg = calls[1][0]
        self.assertNotEqual(second_arg, ['err'])

        _first_arg, second_arg = calls[2][0]
        self.assertEqual(second_arg, ['err'])


if __name__ == '__main__':
    unittest.main()
def test_call_args(self):
    m = mock.Mock()
    m.add_row('A', ['a', 'aa'])
    m.add_row('B', ['b', 'bb', 'bbb'])
    m.add_row('C', ['c', 'cc', 'ccc', 'err'])

    # args is a tuple, the second call
    args, kwargs = m.add_row.call_args_list[1]
    # the second arg is a list
    self.assertTrue('err' not in args[1])

    # third call
    args, kwargs = m.add_row.call_args_list[2]
    self.assertTrue('err' in args[1])

有一些方法可以深入研究這些_Call對象,但僅限於某種程度。 例如,如果被調用的模擬方法中的參數本身是Mock怎么辦?

考慮一下:

def test_create_and_show_main_window_should_make_main_window_vis(qtbot):
    with mock.patch('PyQt5.QtWidgets.QApplication'):
        with mock.patch.object(MainWindow.the(), 'show') as mock_show:
            with mock.patch('sys.exit') as mock_exit:
                
                main_window_class.create_and_show_main_window()
        
    mock_show.assert_called_once()
    mock_exit.assert_called_once()
    call = mock_exit.call_args_list[0]
    call_arg = call.args[0]
    assert call_arg._extract_mock_name() == 'QApplication().exec()'

在上面,我想在我的應用程序代碼中測試以下幾行:

app_instance = QtWidgets.QApplication(sys.argv)
MainWindow.the().show()
sys.exit(app_instance.exec())

...事實證明,在上面, call_arg是類型unittest.mock.MagicMock並且repr(call_arg)是“ <MagicMock name='QApplication().exec()' id='139817836711216'>"

MagicMock有一個name屬性,但如果您嘗試直接使用它,它會自動創建一個新的MagicMock而不是返回它: MagicMock是易用的、強大的對象。 幸運的是,如上圖所示,已經提供了_extract_mock_name方法來獲取它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM