MagicMock被多次调用,但无法断言调用参数

1 投票
1 回答
1290 浏览
提问于 2025-04-17 21:38

(Python 2.6)

我有一个方法:

def send_all(self, messages):
    for message in messages:
        queue.send(message)

我想确认每条消息都调用了 queue.send() 方法

queue = MagicMock()
myobj= MyObject(queue)
myobj.send_all(test_messages)
for test_message in test_messages:
    queue.send.assert_called_once_with(test_message)

test_messages 中的55条消息都是独一无二的。我遇到了以下错误:

AssertionError: Expected to be called once. Called 55 times.

1 个回答

4

assert_called_once_with() 是用来检查你的模拟对象(mock)是否只被调用了一次的;不要用它来测试55次不同的调用。

相反,你应该使用 mock.assert_has_calls() 方法来确认这55次调用确实发生过:

queue.send.assert_has_calls([call(test_message) for test_message in test_messages])

这个方法会检查这55次调用的顺序是否存在;它并不限制模拟对象只能被调用一次。

你也可以检查 mock.mock_calls 属性

assert queue.send.mock_calls == [call(test_message) for test_message in test_messages]

这样可以准确测试这55次调用是否全部发生过。

撰写回答