2010-04-15 6 views
6

Wie teste ich eine Klasse, die Proxy-Clients verwendet, die von einer Webdienst-Referenz generiert wurden?So spiegeln Sie WCF-Webdienste mit Rhino Mocks

Ich möchte den Client mock, 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 eine konkrete Referenz verwende, bekomme ich Zugriff auf die close-Methode, verliere aber die Fähigkeit, den Proxy zu verspotten.

Ich versuche, eine Klasse ähnlich wie dies 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(); 
    } 
} 

Antwort

1

ich eine andere Schnittstelle schaffen würde, die von Ihrem ILoggingServiceClient erbt aber die Close-Methode erstellt. Erstellen Sie anschließend eine Wrapper-Klasse, die die LoggingServiceClient-Instanz umschließt. 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.

0

Meiner Erfahrung nach ist die Zeit, die benötigt wird, um so etwas zu testen, nicht wirklich wert. Richtig gemacht sollte Ihr Adapter meistens nur einen Durchgang machen, da es hauptsächlich darum geht, eine Testnaht für den Aufruf von Code bereitzustellen. An diesem Punkt ist es wie Eigenschaften und Ansichten. Sie müssen sie nicht testen, weil Sie den Code visuell überprüfen können, und es ist so einfach, dass Sie wissen, dass es richtig ist.

0

Dies ist ein bisschen spät, aber ich habe nur nach Wegen gesucht. Da die automatisch generierte Client-Klasse als Teil erzeugt wird, können Sie es wie folgt erweitern:

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

public partial class LoggingServiceClient : ICloseableLoggingServiceClient 
{ 

} 

jetzt Ihre LoggingServiceClient die Close Methode aus dem ClientBase<> vereint hat und was auch immer Ihr Service-Vertrag legt fest, und Sie sollten in der Lage sein zu spotten die ICloseableLoggingServiceClient mit RhinoMocks. Alles, was Sie tun müssen, ist sicherzustellen, dass Sie anstelle der konkreten Clientklasse die neue Schnittstelle injizieren und testen.