Как смоделировать клиента 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<IEvent<GetContactByIdCompletedEventArgs>> observable =
        Observable.FromEvent<GetContactByIdCompletedEventArgs>(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). Но я не понимаю, с чего начать. С Moq я не могу издеваться над BlahServiceClient. Также никакой сгенерированный svcutil интерфейс не может помочь, потому что асинхронные методы не являются частью автоматически сгенерированного интерфейса IBlahService. Я могу предпочесть расширить (через частичные классы и т. Д.) Любой из автоматически сгенерированных классов, но я бы не хотел выбирать ручную сборку всего кода, который может генерировать svcutil (честно говоря, учитывая время и бюджет).

Может кто-нибудь помочь, пожалуйста? Любой указатель в правильном направлении мне очень поможет.

Ответы на вопрос(1)

Ваш ответ на вопрос