Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Объект Mocking используется для сохранения зависимостей из unit test. Иногда у вас будет такой тест, как "SelectPerson", который выберет человека из базы данных и вернет объект Person.

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Мне нужна структура Mock Object?

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

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

Ответ 5

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

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

Ответ 6

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

EDIT: отличный пример из википедии: он позволяет вам заранее проверять код, например, дизайнер автомобилей использует манекен для проверки при столкновении, чтобы проверить поведение автомобиля во время аварии.

Ответ 7

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

Ответ 8

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

Ответ 9

2 рекомендуемых насмешливых фреймворков для .net. Модульные тесты - это Typemock Isolator и Rhino Mock.

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