Я прочитал много статей об модульном тестировании. В большинстве статей говорилось, что мы не должны использовать более одного макета в тесте, но я не могу понять, почему. Иногда нам действительно нужно больше, чем один макет объекта в тесте.Можем ли мы использовать более одного макета в единичном тесте?
ответ
Вы должны добавить столько измерок, сколько необходимо, чтобы изолировать тестируемый класс. Вам нужен макет для каждой зависимости, которая не должна быть частью теста.
Иногда вы ставите два или три класса вместе в тесте для простоты, потому что они создают что-то вроде компонента и сильно связаны. Все остальное должно насмехаться.
Я знаю эту «лучшую практику», чтобы иметь только один макет, а также не понимаю. В наших модульных тестах у нас много издевок, некоторые экологические макеты настраиваются тестовой структурой, которую я написал (например, TransactionService, SecurityService, SessionService). Есть только одна вещь, которую следует учитывать, как уже упоминал Гишу в своем ответе, многие издевательства свидетельствуют о высокой зависимости. Вам решать, когда это слишком много. У нас много небольших интерфейсов, которые требуют много макетов в тестах.
Чтобы превратить ваш ответ вокруг, вы должны не издеваться зависимость, когда:
- Это очень сочетании часть тестируемого класса, как внутренний класс, частный класс и т.д.
- Это обычный класс .NET framework, такой как Collection и т. Д.
- Вы хотите написать тест интеграции, чтобы точно протестировать взаимодействие с этим классом. (Вы все еще издеваетесь над всем остальным, и у вас все еще есть модульные тесты для каждого задействованного класса в изоляции.)
- Это просто дорого издеваться над определенным классом. Будьте осторожны, считая это слишком дорогим, издеваться, кажется, трудно настроить, но, похоже, это легкий ветер по сравнению с проблемами ремонтопригодности, которые у вас будут с использованием реальных классов. Но есть некоторые рамки и технологии, которые не реализуются против интерфейсов, и их очень сложно издеваться. Если это слишком дорого, чтобы поместить эти рамки в рамки вашего собственного интерфейса, вам нужно жить с ними в тестах.
Я не уверен, на какие статьи вы ссылаетесь, но у меня обычно есть один макет объекта на зависимость для тестируемого класса.
В зависимости от контекста вы можете иметь более одного макета в модульном тесте.
Однако я думаю, что «статьи» может быть намек на это
- профилактика над-насмешливый. Когда единичный тест высмеивает всех соавторов, вы оставляете дверь открытой; сценарий может потерпеть неудачу, если вы замените реальных соавторов. Минимизируя количество макетов и используя реальных коллаборационистов, насколько это возможно/возможно, вы минимизируете этот риск.
- Высокое сцепление Предупреждения: Если вам приходится издеваться над многими сотрудниками, чтобы написать единичный тест, это может быть дизайнерский запах, указывающий на то, что у вас высокая связь.
+1 для подсказки соединения.Но я бы не предложил использовать «настоящих соавторов» только для уменьшения количества макетов. Иногда вы тестируете несколько классов вместе, потому что они сильно связаны и создают компонент. Но все снаружи должно быть изолировано как можно лучше. Если вы обнаружите, что у вас слишком много макетов, у вас проблема связи. Тогда вы должны реорганизовать. –
Я рекомендую использовать «настоящие» коллабораторы не для уменьшения количества макетов, а для того, чтобы сделать реальную работу тестового зеркала реальным. Это делается для того, чтобы избежать случая, когда ваш тест проходит, потому что вы играли с набором макетов объектов. Однако в реальном мире он не работает, потому что одна из зависимостей теперь не действует/ведет себя как соответствующий макет. Если соавтор не замедляет модульный тест, создавая интерфейс на границе, а затем используя макет, это перебор. – Gishu
@ Гишу: Я не согласен. Мошки предназначены для изоляции, а не для скорости. Вам нужно изолировать тестируемый код как можно лучше, это как лабораторный тест в области химии, вы упрощаете среду для изоляции одного процесса. Затем вы можете доказать, что делает процесс, независимо от неизвестной среды. Матки должны быть тривиальными и, следовательно, управляемыми. Другие классы еще неизвестны. То, что вы делаете, также важно, но это интеграционный тест, который вы должны сделать после того, как доказали, что одни классы ведут себя в соответствии со спецификациями. –
«Искусство модульного тестирования» говорит именно это. Проверяйте только одну вещь на тест, всякий раз, когда что-то означает, не ясно. –