Можем ли мы использовать более одного фиктивного объекта в модульном тесте? - PullRequest
1 голос
/ 12 мая 2009

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

Ответы [ 3 ]

5 голосов
/ 12 мая 2009

В зависимости от контекста в модульном тесте может быть более одного макета.

Однако я думаю, на что могут намеки «статьи», это

  • предотвращение чрезмерного издевательства . Когда юнит-тест исключает всех соавторов, вы оставляете дверь открытой; сценарий может потерпеть неудачу, если вы замените настоящих соавторов. Минимизируя количество насмешек и используя реальных сотрудников, насколько это возможно / возможно, вы минимизируете этот риск.
  • High Coupling оповещения: если вам приходится издеваться над множеством сотрудников, чтобы написать модульный тест, это может быть запахом дизайна, указывающим на то, что у вас высокая связь.
3 голосов
/ 13 мая 2009

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

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

Я знаю эту «лучшую практику», чтобы иметь только одну насмешку, а также не понимаю ее. В наших модульных тестах у нас есть много макетов, некоторые макеты среды настраиваются с помощью инфраструктуры тестирования, которую я написал (например, TransactionService, SecurityService, SessionService). Есть только одна вещь, которую следует учитывать, поскольку Гишу уже упоминал в своем ответе, что многие насмешки являются признаком высокой зависимости. Вам решать, когда это слишком много. У нас много небольших интерфейсов, которые требуют много проверок в тестах.

Чтобы перевернуть свой ответ, вы должны не издеваться над зависимостью, когда:

  • Это высокосвязанная часть тестируемого класса, такая как внутренний класс, закрытый класс и т. Д.
  • Это распространенный класс .NET Framework, такой как Collection и тому подобное
  • Вы хотите написать интеграционный тест, чтобы точно проверить взаимодействие с этим классом. (Вы все еще издеваетесь над всем остальным, и у вас все еще есть модульные тесты для каждого участвующего класса в изоляции.)
  • Это просто дорого издеваться над определенным классом. Будьте осторожны, решив, что это слишком дорого, макеты кажутся сложными в настройке, но они оказываются несложными по сравнению с проблемами сопровождения, которые у вас возникнут при использовании реальных классов. Но есть некоторые фреймворки и технологии, которые не реализуются на интерфейсах и которые очень трудно подделать. Если слишком сложно размещать эти классы каркаса за собственным интерфейсом, вам нужно жить с ними в тестах.
3 голосов
/ 12 мая 2009

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

...