В чем разница между насмешкой и исправлением обезьяны?

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

import some_module

def get_file_data():
  return "here is the pretend file data"

some_module.get_file_data = get_file_data

# proceed to test

Я вижу, что это называется исправлением обезьян, как в вопросе. Я также вижу, что слово mock часто используется вместе с исправлением обезьяны или в очень похожих сценариях.

Есть ли разница между этими двумя понятиями?


person Jad S    schedule 17.01.2017    source источник
comment
Это связанный ответ github.com/pytest-dev/pytest/issues /4576#issuecomment-449864333   -  person foxiris    schedule 18.03.2019


Ответы (1)


Monkey patching заменяет функцию/метод/класс другим во время выполнения, для тестирования целей, исправления ошибка или иное изменение поведения.

библиотека unittest.mock использует исправление обезьян для замены части вашего программное обеспечение, тестируемое фиктивными объектами. Он предоставляет функциональные возможности для написания умных модульных тестов, таких как:

  • Он хранит записи о том, как вызываются фиктивные объекты, поэтому вы можете проверить поведение вызова вашего кода с помощью утверждений.
  • Удобный декоратор patch() для фактического исправления обезьяны.
  • Вы можете заставить фиктивные объекты возвращать определенные значения (return_value), вызывать определенные исключения (side_effect).
  • Насмешка над «магическими методами» (например, __str__).

Вы можете использовать mock, например, чтобы заменить сетевой ввод-вывод (urllib, запросы) в клиенте, чтобы юнит-тесты работали независимо от внешнего сервера.

person René Pijl    schedule 03.11.2017
comment
Значит, monkey-patching и mock по сути одно и то же? - person WestCoastProjects; 29.05.2019
comment
Вроде... может быть некоторая путаница в концепции макета и библиотеки макетов. Как уже упоминалось, monkey-patching — это концепция переключения одних функций на другие для облегчения тестирования. mock — это то, чем вы monkey-patch заменяете исходную функциональность. mock library дает вам объект, который вы можете использовать для monkey-patch. Объект mock из mock library также дает вам отличные возможности, которые помогают вам проверить, ведет ли макет себя определенным образом. - person Luis Meraz; 12.04.2020