Что такое Object Mocking и когда он мне нужен? - PullRequest
42 голосов
/ 07 августа 2008

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

Ответы [ 9 ]

35 голосов
/ 07 августа 2008

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

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

17 голосов
/ 07 августа 2008

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

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

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

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

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

12 голосов
/ 07 августа 2008

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

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

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

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

9 голосов
/ 07 августа 2008

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

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

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

6 голосов
/ 07 августа 2008

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

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

5 голосов
/ 07 августа 2008

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

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

3 голосов
/ 07 августа 2008

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

1 голос
/ 07 августа 2008

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

0 голосов
/ 15 октября 2008

2 рекомендуемых макетов для тестирования .net Unit: Typemock Isolator и Rhino Mock.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...