[英]Python mock call_args_list unpacking tuples for assertion on 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
定義了一個名為_Call
的tuple
的子類,其實例是你在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.