Как смоделировать клиента WCF, используя Moq?
В своем проекте я использую: SL5 + MVVM + Prism + WCF + Rx + Moq + Silverlight Framework для тестирования модулей.
Я новичок в модульном тестировании и недавно начал работать с DI, Patterns (MVVM) и т. Д. Следовательно, следующий код имеет много возможностей для улучшения (пожалуйста, не стесняйтесь отвергать весь подход, который я использую, если вы так думаете).
Чтобы получить доступ к моим службам WCF, я создал фабричный класс, как показано ниже (опять же, он может быть ошибочным, но, пожалуйста, посмотрите):
namespace SomeSolution
{
public class ServiceClientFactory:IServiceClientFactory
{
public CourseServiceClient GetCourseServiceClient()
{
var client = new CourseServiceClient();
client.ChannelFactory.Faulted += (s, e) => client.Abort();
if(client.State== CommunicationState.Closed){client.InnerChannel.Open();}
return client;
}
public ConfigServiceClient GetConfigServiceClient()
{
var client = new ConfigServiceClient();
client.ChannelFactory.Faulted += (s, e) => client.Abort();
if (client.State == CommunicationState.Closed) { client.InnerChannel.Open(); }
return client;
}
public ContactServiceClient GetContactServiceClient()
{
var client = new ContactServiceClient();
client.ChannelFactory.Faulted += (s, e) => client.Abort();
if (client.State == CommunicationState.Closed) { client.InnerChannel.Open(); }
return client;
}
}
}
Он реализует простой интерфейс, как показано ниже:
public interface IServiceClientFactory
{
CourseServiceClient GetCourseServiceClient();
ConfigServiceClient GetConfigServiceClient();
ContactServiceClient GetContactServiceClient();
}
В моих виртуальных машинах я делаю DI вышеупомянутого класса и использую Rx для вызова WCF, как показано ниже:
var client = _serviceClientFactory.GetContactServiceClient();
try
{
IObservable observable =
Observable.FromEvent(client, "GetContactByIdCompleted").Take(1);
observable.Subscribe(
e =>
{
if (e.EventArgs.Error == null)
{
//some code here that needs to be unit-tested
}
},
ex =>
{
_errorLogger.ProcessError(GetType().Name, MethodBase.GetCurrentMethod().Name, ErrorSource.Observable, "", -1, ex);
}
);
client.GetContactByIdAsync(contactid, UserInformation.SecurityToken);
}
catch (Exception ex)
{
_errorLogger.ProcessError(GetType().Name, MethodBase.GetCurrentMethod().Name, ErrorSource.Code, "", -1, ex);
}
Теперь я хочу построить модульные тесты (да, это не TDD). Но я нене понимаю, с чего начать. С Мок я могут издеваться над BlahServiceClient. Также никакой сгенерированный svcutil интерфейс не может помочь, потому что асинхронные методы не являются частью автоматически сгенерированного интерфейса IBlahService. Я могу предпочесть расширить (через частичные классы и т. Д.) Любой из автоматически сгенерированных классов, но я бы не хотел выбирать ручную сборку всего кода, который может генерировать svcutil (честно говоря, учитывая время и бюджет).
Может кто-нибудь, пожалуйста, помогите? Любой указатель в правильном направлении очень мне поможет ».