У вас должно быть два набора тестов:
- Модульные тесты для ваших пользовательских реализаций этих интерфейсов
- Интеграционные тесты для ваших сервисов (которые также охватывают интерфейсы, но в сценарии полная настройка в реальном времени )
Реализация модульного тестирования должна выполняться так же, как и все остальное. Это действительно сужает проверку того, что делают эти пользовательские реализации. Обычные, старые юнит-тесты.
Однако обратите внимание, что есть два основных препятствия для успешного модульного тестирования таких реализаций битов WCF:
- Заголовки контекста WCF (или просто поместить контекст в одиночку) будет трудно работать с точки зрения имитации, так как они происходят из статического класса ( OperationContext.Current )
- Проверка некоторых параметров метода может быть невозможна, поскольку они запечатаны (например, InstanceContext ) или достаточно сложны
Естественно, все это можно преодолеть с использованием соответствующих приемов и инструментов:
- Для закрытых классов, которые не будут работать с насмешками, вы просто создаете экземпляры (с помощью таких инструментов, как AutoFixture ) и настраиваете графы объектов / зависимостей вручную (это может занять много времени) , но в большинстве случаев вы не используете их все).
- Все, что можно смоделировать / заглушить, должно быть сделано так: FakeItEasy давайте просто заглушим любой класс, если он не запечатан (не должен быть интерфейсом). Замечательно иметь дело с неиспользованными параметрами метода.
Чтобы справиться с OperationContext.Current
(и подобным), вам, вероятно, придется немного изменить свой дизайн. Точно, все классы, использующие текущий контекст в некоторых отношениях, должны будут реализовывать метод protected virtual
, предоставляющий его (или любую другую часть, которая может быть полезна, например, заголовки запроса):
protected virtual MessageHeaders GetContextHeaders()
{
return OperationContext.Current.RequestContext.RequestMessage.Headers;
}
Затем вам нужно будет создать производный класс testable , который будет вместо этого возвращать макетированную / заглушенную версию этих заголовков (или контекст, или что вы планируете использовать) и создавать экземпляры этого класса в модульных тестах. .
Как только вы закончите модульное тестирование, интеграция должна быть короткой прогулкой. Просто установите ваши объекты так, как они будут использоваться в реальном сценарии ... и убедитесь, что они работают как положено.
Дополнительное примечание : модульное тестирование также можно выполнить более простым способом, однако вам также понадобятся платные инструменты (например, Typemock Isolator , которые позволяют вам высмеивать статические / запечатанные классы ) и / или немного более тяжелые / сложные ( PEX / Moles ).