Метод экземпляра фиктивного патча Python и проверка аргументов вызова

Я использую Mock (http://mock.readthedocs.org/en/latest/) библиотека с Python 2.7. У меня есть основная функция, которая вызывает несколько других функций, которые я пытаюсь протестировать.

Другие функции, которые он вызывает, являются другими методами экземпляра (например, def _other_function(self, a, b).

Я вызываю свою основную функцию, и у меня есть другие функции, которые она вызывает, исправлены. Я только что добавил autospec=True в патч. Однако, когда я проверяю аргументы вызова, он показывает аргумент self (как и ожидалось):

python2.7> _other_function_mock.call_args_list
[call(<some.module.class.method object at 0x9acab90>, 1, 2)]

До установки autospec=True он показывал бы только те аргументы, которые я действительно передал (1 и 2). Поскольку теперь аргументы вызова показывают ссылку на self, я не могу просто вызвать mock_object.assert_any_call(1, 2). Мне нужно будет выбрать аргументы из mock_object.call_args_list и сравнить.

Есть ли способ по-прежнему вызывать mock.assert_any_call без необходимости выбирать аргументы вручную, чтобы проверить правильность переданных аргументов?

Или есть что-то лучшее, что я могу сделать, чтобы исправить методы экземпляра?


person darksky    schedule 27.05.2015    source источник


Ответы (1)


По сути, есть два способа поиграться с self эталоном для autospec=True патчей.

  1. Используйте mock.ANY, чтобы игнорировать первый аргумент.
  2. Исправьте объект с помощью patch.object вместо исправления ссылки на статический метод.

В любом случае 2 не может использоваться во всех случаях, иногда вы не можете иметь экземпляр объекта в контексте метода тестирования; кроме того, таким образом часто делают тест менее понятным и более сложным. Я всегда предпочитаю использовать 1 в своих тестах:

@patch("my_module.MyClass.my_method", autospec=True)
def test_my_test(self, mock_my_method):
    my_module.MyClass().my_method(1,2)
    mock_my_method.assert_any_call(mock.ANY, 1, 2)
person Michele d'Amico    schedule 29.05.2015