Wie verspotte ich einen WCF-Client mit Moq?

In meinem Projekt verwende ich: SL5 + MVVM + Prisma + WCF + Rx + Moq + Silverlight Unit Testing Framework.

Ich bin neu im Unit-Testen und habe kürzlich mit DI, Patterns (MVVM) usw. begonnen. Daher bietet der folgende Code viel Raum für Verbesserungen (bitte lehnen Sie den gesamten Ansatz ab, den ich verfolge, wenn Sie dies glauben).

Um auf meine WCF-Dienste zugreifen zu können, habe ich eine Factory-Klasse wie die folgende erstellt (die wiederum fehlerhaft sein kann, aber sehen Sie bitte nach):

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;
        }
    }
}

Es implementiert eine einfache Schnittstelle wie folgt:

public interface IServiceClientFactory
{
    CourseServiceClient GetCourseServiceClient();
    ConfigServiceClient GetConfigServiceClient();
    ContactServiceClient GetContactServiceClient();
}

In meinen VMs mache ich DI der oben genannten Klasse und benutze Rx, um WCF wie folgt aufzurufen:

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);
}

Jetzt möchte ich Unit-Tests erstellen (ja, es ist kein TDD). Aber ich verstehe nicht, wo ich anfangen soll. Mit Moq kann ich den BlahServiceClient nicht verspotten. Auch keine von svcutil generierte Schnittstelle kann Abhilfe schaffen, da asynchrone Methoden nicht Teil der automatisch generierten IBlahService-Schnittstelle sind. Ich würde es vielleicht vorziehen, eine der automatisch generierten Klassen (durch Teilklassen usw.) zu erweitern, aber ich würde es hassen, den Code, den svcutil generieren kann, manuell zu erstellen (ehrlich gesagt unter Berücksichtigung von Zeit und Budget).

Kann jemand bitte helfen? Jeder Zeiger in die richtige Richtung würde mir sehr helfen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage