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

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

Ответов (9)

Решение

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

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

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

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

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

  1. Представление

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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