6 Stimmen

Wie man WCF-Webdienste mit Rhino Mocks nachahmt

Wie teste ich eine Klasse, die von einer Webdienstreferenz generierte Proxy-Clients verwendet?

Ich möchte den Client spiegeln, aber die generierte Client-Schnittstelle enthält nicht die Close-Methode, die erforderlich ist, um den Proxy ordnungsgemäß zu beenden. Wenn ich nicht die Schnittstelle, sondern einen konkreten Verweis verwende, erhalte ich Zugriff auf die Close-Methode, verliere aber die Möglichkeit, den Proxy nachzubilden.

Ich versuche gerade, eine ähnliche Klasse zu testen:

public class ServiceAdapter : IServiceAdapter, IDisposable
{
    // ILoggingServiceClient is generated via a Web Service reference
    private readonly ILoggingServiceClient _loggingServiceClient; 

    public ServiceAdapter() : this(new LoggingServiceClient()) {}

    internal ServiceAdapter(ILoggingServiceClient loggingServiceClient)
    {
        _loggingServiceClient = loggingServiceClient;
    }

    public void LogSomething(string msg)
    {
        _loggingServiceClient.LogSomething(msg);
    }

    public void Dispose()
    {
        // this doesn't compile, because ILoggingServiceClient doesn't contain Close(), 
        // yet Close is required to properly terminate the WCF client
        _loggingServiceClient.Close(); 
    }
}

1voto

PatrickSteele Punkte 13938

Ich würde eine weitere Schnittstelle erstellen, die von Ihrem ILoggingServiceClient erbt, aber die Close-Methode hinzufügt. Dann erstellen Sie eine Wrapper-Klasse, die die LoggingServiceClient-Instanz umhüllt. Etwas wie:

public interface IDisposableLoggingServiceClient : ILoggingServiceClient
{
    void Close();
}

public class LoggingServiceClientWrapper : IDisposableLoggingServiceClient
{
    private readonly LoggingServiceClient client;

    public LoggingServiceClientWrapper(LoggingServiceClient client)
    {
        this.client = client;
    }

    public void LogSomething(string msg)
    {
        client.LogSomething(msg);
    }

    public void Close()
    {
        client.Close();
    }
}

Jetzt kann Ihr Service-Adapter IDisposableLoggingServiceClient verwenden.

0voto

Shane Courtrille Punkte 13622

Meiner Erfahrung nach ist der Zeitaufwand für solche Tests nicht wirklich lohnenswert. Richtig gemacht sollte Ihr Adapter meist nur einen Durchlauf machen, da sein Hauptzweck darin besteht, eine Testumgebung für den Aufruf von Code zu bieten. An diesem Punkt ist es ähnlich wie bei Eigenschaften und Ansichten. Man braucht sie nicht zu testen, weil man den Code visuell inspizieren kann und er so einfach ist, dass man weiß, dass er richtig ist.

0voto

Darko Z Punkte 37188

Es ist ein bisschen spät, aber ich habe gerade nach Möglichkeiten gesucht, dies zu umgehen. Da die automatisch generierte Client-Klasse als partielle Klasse generiert wird, können Sie sie wie folgt erweitern:

public interface ICloseableLoggingServiceClient : ILoggingServiceClient
{
    void Close();
}

public partial class LoggingServiceClient : ICloseableLoggingServiceClient
{

}

jetzt Ihr LoggingServiceClient hat die Close Methode aus dem ClientBase<> und was immer Ihr Dienstleistungsvertrag vorsieht, und Sie sollten in der Lage sein, die ICloseableLoggingServiceClient mit RhinoMocks. Alles, was Sie tun müssen, ist sicherzustellen, dass Sie die neue Schnittstelle injizieren und mit ihr testen, anstatt mit der konkreten Client-Klasse.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X