Службы данных WCF: Mocking OperationContext - PullRequest
6 голосов
/ 16 февраля 2011

Мы хотели бы высмеять класс OperationContext для тестирования. Мы используем «Макет». Но OperationContext является запечатанным классом и не может быть высмеян. Поэтому мы пытаемся создать фиктивный объект OperationContext. Но конструктор OperationContext принимает IContextChannel в качестве параметра. Нам хотелось бы узнать, как получить IContextChannel, чтобы его можно было передать конструктору OperationContext.

Ответы [ 2 ]

3 голосов
/ 12 июля 2013

Общая рекомендация - реализовать службы wcf без ссылки на wcf .

Примеры того, как это сделать, приведены в http://marcin.floryan.pl/blog/2012/01/do-we-really-need-wcfmock

Мы заменили ссылкув OperationContext со ссылкой на OperationResponse.OperationResponse должен быть определен как интерфейс и может быть вставлен в конструктор так же, как хранилище в приведенном примере.Наш метод тестирования теперь становится немного короче и более читабельным.

И в http://blogs.msdn.com/b/ploeh/archive/2006/12/04/integrationtestingwcfservices.aspx

Давайте на минуту рассмотрим необходимость выполнения авторизации.Вы можете проверить OperationContext.Current непосредственно в каждой из ваших реализаций операций, но это будет смешивать проблемы (бизнес-логика, реализованная в операции, смешанной с авторизацией).Правильный способ - предоставить класс, производный от ServiceAuthorizationManager, и настроить службу для использования этого класса для авторизации.Это позволило бы вам продолжать модульное тестирование ваших реализаций операций, но, очевидно, вам также необходимо протестировать сам менеджер авторизации, и оказывается, что интеграционное тестирование - это самый простой способ выполнить эту задачу.

Если вам все еще нужно использовать макет, следуйте рекомендациям http://blogs.msdn.com/b/ploeh/archive/2008/06/28/unit-testing-duplex-wcf-services.aspx

Все, что вам нужно сделать, это заменить вызов toOperationContext.GetCallbackChannel чем-то абстрактным.В .NET 3.5 самая простая абстракция - это Func, которая имеет ту же сигнатуру, но если вы работаете в .NET 3.0, вы всегда можете определить свой собственный аналогичный тип делегата.

В качестве альтернативыВ последнем случае вы можете использовать WCFmock

#if DEBUG
     using WebOperationContext = System.ServiceModel.Web.MockedWebOperationContext;
#endif

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

С http://blog.gfader.com/2010/08/how-to-unit-test-wcf-service.html

все ваши вызовы OperationContext.Current.Channel.SessionId перехватываются MockedOperationContext, но только в ваших тестах вы издеваетесь над OperationContext.В вашей обычной среде MockedOperationContext действует как прокси для реального OperationContext.

0 голосов
/ 13 июля 2011

Проект NetFX содержит ряд классов-оболочек и интерфейсов, позволяющих использовать только такие вещи.

...