如何检查传递给模拟对象方法的参数

How to check arguments passed to a method of a mocked object

我正在尝试使用 unittest.mock.MagicMock 来模拟 API。我不明白如何检查传递给模拟对象上的方法的参数。我认为这应该有效:

from unittest import mock

import unittest

class TestMock(unittest.TestCase):
    def setUp(self):
        pass

    def test_basic(self):
        obj = unittest.mock.MagicMock()
        obj.update(1,2,a=3)

        print("obj.update: ", obj.update)
        print("obj.update.call_args: ", obj.update.call_args)
        print("obj.update.call_args.args: ", obj.update.call_args.args)

        self.assertEqual((1,2), obj.update.call_args.args)

但是,pytest test_mock.py 失败了:

test_mock.py:17: AssertionError
------------------------------------------------ Captured stdout call ------------------------------------------------
obj.update:  <MagicMock name='mock.update' id='140707024533072'>
obj.update.call_args:  call(1, 2, a=3)
obj.update.call_args.args:  args
============================================== short test summary info ===============================================
FAILED test_mock.py::TestMock::test_basic - AssertionError: (1, 2) != args
================================================= 1 failed in 0.10s ==================================================

The docs 说我应该能够通过 call_args.args 访问位置参数,但这似乎是在创建一个模拟字段。验证参数的正确方法是什么?

argskwargs 值在 Python 3.8 中引入。使用 Python 3.7 或更早版本时会出现此行为。