Короткий ответ
Для проверки аргументов используют mock.assert_called_with(...) или assert_called_once_with(...), которые сравнивают переданные аргументы с ожидаемыми, а не просто факт вызова, который проверяется методом assert_called().
Как это работает подробнее
Каждый Mock записывает историю вызовов в атрибуте call_args_list, включая позиционные и именованные аргументы каждого вызова, а не только факт его наличия. assert_called_with сравнивает последний вызов с переданными значениями и бросает AssertionError с понятной разницей, показывая и ожидаемые, и фактические аргументы.
Пример кода
testing_example_301.py
from unittest.mock import Mock
def notify_user(notifier, user_id, message):
notifier.send(user_id, message)
def test_notify_user_passes_correct_arguments():
notifier = Mock()
notify_user(notifier, user_id=42, message="Hi")
notifier.send.assert_called_once_with(42, "Hi")Что использовать на практике
- Практика. Такая проверка важна, когда важно не только что метод вызвали, но и что ему передали правильные данные — например, что уведомление отправлено именно на адрес текущего пользователя, а не на пустую строку или адрес по умолчанию, оставшийся от предыдущей итерации кода.
Подводные камни
- Риск. Использовать assert_called() вместо assert_called_with(), когда на самом деле важны конкретные аргументы — тест пройдёт даже при передаче совершенно неверных данных. Не учитывать, что assert_called_once_with ещё и проверяет количество вызовов равное единице, и упадёт, если метод по ошибке вызвали дважды, даже с правильными аргументами в обоих случаях.