Wie zum Hohn WCF-client über Moq?

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

Ich bin neu in unit-Tests und habe vor kurzem angefangen, in DI, Muster (MVVM) - etc. Daher ist der folgende code ist eine Menge Spielraum für Verbesserung (fiel bitte frei, lehnen den ganzen Ansatz, den ich nehme, wenn Sie so denken).

Zugriff auf meine WCF-Dienste, die ich erstellt habe, eine factory-Klasse wie folgt (wieder, es kann fehlerhaft sein, aber bitte haben Sie einen Blick):

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 unten:

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

In meinem VMs mache ich DI von der obigen Klasse und mit Rx call WCF wie folgt:

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

Nun will ich bauen, unit-tests (ja, es ist nicht TDD). Aber ich verstehe nicht, wo zu beginnen. Mit Moq kann ich nicht verspotten die BlahServiceClient. Auch keine svcutil erzeugt-Schnittstelle helfen können, weil async-Methoden sind nicht Teil der automatisch generierten IBlahService-Schnittstelle. Ich mag lieber verlängern (durch partielle Klassen usw.) die automatisch generierten Klassen, aber ich würde es hassen, entscheiden Sie sich für manuell erstellen Sie den code, der svcutil erzeugen kann (ehrlich gesagt, in Anbetracht der Zeit und budget).

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

"//hier den code, der benötigt, um sein Gerät-getestet" - Was für eine Art von code ? Weil ich denke, dass Sie testen die falsche Sache. Wenn Sie möchten, um die Einheit den code zu testen, dann testen Sie es in einem isolierten Szenario ohne WCF und alle service-Infrastruktur.
Das ist sehr wahr Michal. Sollte ich umgestalten, meinen code zu isolieren, die einer anderen Logik von WCF-Aufruf. Vielen Dank.
Es gibt nicht viel umgestalten, hier. Legen Sie einfach Ihren "code" in seiner eigenen Methode und testen Sie diese Methode. Keine Notwendigkeit zum testen der WCF-Sachen dann.
in meinem Fall, habe ich gerade getan, die Schaffung eines service. Wir wollen, unit-tests, um sicherzustellen, telefonieren via wsdl arbeitet immer so, wir brauchen eine süße von tests. So versuche ich unit-test-meine service-Methoden...als ob ich ein client nutzt den Webdienst. Also meine Absicht ist, die zum aufrufen von Methoden angegeben, die in der WSDL als eine hypothetische Kunde/Verbraucher von my web service. Jetzt auf der anderen Seite könnte ich auch wollen, erstellen von unit-tests direkt in mein SErvice-Projekt selbst zu testen, die Methoden? Nicht sicher über das, was unit-Tests.
was ist der client.ChannelFactory zu tun?

InformationsquelleAutor Dharmesh | 2012-12-27

Schreibe einen Kommentar