Когда использовать частичные моки?

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

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

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

В настоящее время у меня есть несколько тестов, настроенных таким образом, не доставят ли мне проблемы из-за этого в будущем?


person George Mauer    schedule 26.09.2008    source источник


Ответы (4)


Хороший дизайн, имхо. Что произойдет, если кто-то придет за вами и изменит ваш метод, удалив вызов Reset? (кстати, почему в ваших объектах так много состояний?) Возможно, вы никогда не узнаете, что они облажались, пока не начнете производство. Издеваясь над ним и утверждая при вызове этого метода, вы можете быть уверены, что никто не испортит работу, поддерживая ваш код.

person Community    schedule 26.09.2008
comment
Уилл, я не совсем понимаю, что вы пытаетесь сказать. Я спрашиваю, когда мне следует использовать частичные моки, а не то, как они работают. - person George Mauer; 26.09.2008
comment
Похоже, вы не совсем понимали разницу. Достал, теперь отвечу только на ваш вопрос. - person ; 26.09.2008

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

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

Можете ли вы: (а) использовать тестирование на основе состояния, чтобы подтвердить, что состояние объекта такое, как вы ожидаете, после того, как реальный метод Reset был вызван изнутри; или (б) использовать тестирование на основе взаимодействия, чтобы убедиться, что соответствующие вызовы взаимодействующих объектов были сделаны в результате реального Reset метода?

Вы можете найти Тест на запах: имитация конкретных классов от mockobjects.com полезно.

person James Mead    schedule 18.12.2008

Насколько я понимаю, частичный макет состоял в том, что он был для насмешек над абстрактными классами, с насмешкой только над абстрактными методами, а существующие конкретные методы оставались такими, какие они есть?

person skaffman    schedule 26.09.2008

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

Это позволит отделить ваш тест от других тестов, что приятно.

person Nathan Feger    schedule 26.09.2008