Создание тестовой службы WCF без OperationContext

Я реализовал услугу WCF для подписки/публикации (для собственного удовольствия), которая работает достаточно хорошо. Как и все блоги и книги, которые я видел, они все используют OperationContext для получения обратного вызова клиентов. После небольшого чтения из-за того, что многие люди говорили, что не используют OperationContext, я обнаружил, что не могу создать соответствующие модульные тесты. Но я не смог найти альтернативы. Я полагаю, что метод subscribe может принять параметр для его собственного адреса? Я мог видеть, что код может быть проверен с точки зрения тестового стенда интеграции, но не для модульного тестирования, так как OperationContext всегда будет null.

Как получить конечную точку клиента при подписке на мой сервис без использования OperationContext?

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

Спасибо.

Ответ 1

Разработчики Microsoft действительно любят ключевые слова sealed и static (а также internal), и они ненавидят virtual. Из-за этого стандартные подходы к тестированию и фреймворки часто не работают. У вас есть два варианта:

  • Обменивать доступ к OperationContext в пользовательском классе и вставлять экземпляр класса в вашу службу. Это потребует дополнительной работы, потому что вам нужно будет делать инъекции где-то вне вашей службы. Например, для впрыска конструктора потребуется пользовательский IInstanceProvider.
  • Используйте более мощные рамки тестирования. Проверьте Moles framework, который способен перехватывать вызовы и перенаправлять их. Это позволяет "издеваться" о закрытых классах и статических методах/свойствах.

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