Проверка параметров вызова из макетного объекта

#python #unit-testing #mocking

#python #модульное тестирование #издевательство

Вопрос:

Если я изменю объект, который использовался в качестве параметра для макета, после того, как этот макет был вызван, объект в mock.call также изменится. Поскольку это предложение было очень запутанным, позвольте мне показать вам, что я имею в виду:

 from unittest import mock

test_mock = mock.Mock()

test_parameter = ["only_entry_of_this_list"]
test_mock(argument=test_parameter)

test_mock.assert_has_calls([mock.call(argument=["only_entry_of_this_list"])])
  

работает отлично, как я и ожидал. Но если я изменю test_parameter после того, как макет был вызван следующим образом:

 from unittest import mock

test_mock = mock.Mock()

test_parameter = ["only_entry_of_this_list"]
test_mock(argument=test_parameter)
test_parameter.append("another_entry_of_this_list")

test_mock.assert_has_calls([mock.call(argument=["only_entry_of_this_list"])])
  

Я получаю:

 AssertionError: Calls not found.
Expected: [call(argument=['only_entry_of_this_list'])]
Actual: [call(argument=['only_entry_of_this_list', 'another_entry_of_this_list'])]
  

Теперь мой вопрос заключается в том, является ли это ожидаемым поведением, поскольку это затруднило бы тестирование итеративных вызовов mock с также итеративно изменяющимися аргументами, поскольку доступно только последнее состояние аргумента.

Комментарии:

1. Не знаю, намеренно это или нет. Но вы можете попробовать test_mock(argument=test_parameter[:]) в каждом вызове отделить.