Что такое Object Mocking и когда он мне нужен?

StackOverflow https://stackoverflow.com/questions/4314

  •  08-06-2019
  •  | 
  •  

Вопрос

Многие люди используют Mock Objects при написании модульных тестов.Что такое Макет объекта?Зачем мне это может понадобиться?Нужна ли мне Mock Object Framework?

Это было полезно?

Решение

Object Mocking используется для исключения зависимостей из вашего модульного теста.Иногда у вас будет тест типа «SelectPerson», который выберет человека из базы данных и вернет объект Person.

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

Другие советы

Несколько человек уже ответили на вопрос «что», но вот несколько быстрых «почему», которые я могу придумать:

  1. Производительность

    Поскольку модульные тесты должны быть быстрыми, тестирование компонента, который взаимодействует с сетью, базой данных или другим ресурсом с интенсивным временем, не нужно платить штраф, если это сделано с использованием фиктивных объектов.Экономия быстро накапливается.

  2. Сотрудничество

    Если вы пишете хорошо инкапсулированный кусок кода, который необходимо взаимодействовать с чужой кодом (который еще не был написан, или в параллельно Интерфейс был согласован.В противном случае ваш код не может начать тестироваться, пока другой компонент не будет закончен.

Макетный объект позволяет вам тестировать только то, что вы пишете, и абстрактные детали, такие как доступ к ресурсу (диску, сетевой службе и т. д.).Затем макет позволяет вам притвориться этим внешним ресурсом, классом или чем-то еще.

На самом деле вам не нужна структура макета объекта, просто расширьте класс функциональности, о которой вы не хотите беспокоиться в своем тесте, и убедитесь, что тестируемый класс может использовать ваш макет вместо реальной вещи (передайте его через конструктор или установщик или что-то в этом роде.

Практика покажет, когда моки полезны, а когда нет.

РЕДАКТИРОВАТЬ:Имитация ресурсов особенно важна, поэтому вам не нужно полагаться на их существование во время теста, и вы можете имитировать детали того, как они существуют и на что они реагируют (например, имитация исключения FileNotFoundException или отсутствующего веб-сервиса или различные возможные возвращаемые значения веб-сервиса)...и все это без увеличения времени доступа (в тесте имитация окажется НАМНОГО быстрее, чем доступ к таким ресурсам).

Нужна ли мне Mock Object Framework?

Конечно, нет.Иногда написание макетов вручную может быть довольно утомительным.Но для простых вещей это совсем неплохо.Применяя принцип Последний ответственный момент к макетам фреймворков, вам следует переходить от рукописных макетов к фреймворку только тогда, когда вы доказали себе, что рукописные макеты — это больше проблем, чем пользы.

Если вы только начинаете заниматься мокингом, то переход сразу к фреймворку как минимум удвоит вашу кривую обучения (можете ли вы удвоить кривую?).Издевательские фреймворки сделают много больше смысла, если вы потратили несколько проектов на написание макетов вручную.

Object Mocking — это способ создать «виртуальный» или имитируемый объект из интерфейса, абстрактного класса или класса с виртуальными методами.Это позволяет вам как бы обернуть один из них в собственное определение для целей тестирования.Это полезно для создания объекта, на который полагается определенный блок кода, который вы тестируете.

Популярный вариант, который мне нравится использовать, называется Мокк, но есть много других, таких как RhinoMock, и множество других, о которых я не знаю.

Это позволяет вам протестировать, как одна часть вашего проекта взаимодействует с остальными, не создавая его целиком и не теряя при этом жизненно важную часть.

РЕДАКТИРОВАТЬ:Отличный пример из Википедии:Это позволяет вам заранее протестировать код, подобно тому, как дизайнер автомобилей использует манекен для краш-тестов, чтобы проверить поведение автомобиля во время аварии.

Другое использование — это возможность протестировать другие части вашей системы, которые еще не созданы.Например, если ваш класс зависит от какого-то другого класса, который является частью функции, над которой работает кто-то другой, вы можете просто запросить практически полный интерфейс, запрограммировать интерфейс и просто высмеивать детали так, как вы ожидаете, что они будут работать.Затем убедитесь, что ваши предположения об интерфейсе верны (либо во время разработки, либо после завершения работы над функцией).

Будет ли вам полезен макет макета, частично зависит от языка кода, который вы пишете.В статическом языке вам придется приложить дополнительные усилия, чтобы обманом заставить компилятор принять ваши фиктивные объекты в качестве замены реальных объектов.В языках с динамической типизацией, таких как Python, Ruby или Javascript, вы обычно можете просто прикрепить методы к произвольному объекту или классу и передать их в качестве параметра — тогда фреймворк принесет гораздо меньшую ценность.

Двумя рекомендуемыми платформами макетирования для модульного тестирования .net являются Typemock Isolator и Rhino Mock.

По следующей ссылке вы можете увидеть объяснение Typemock, почему вам нужен насмешливая структура для модульного тестирования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top