2010-04-15 4 views
6

Comment tester une classe qui utilise les clients proxy générés par un service Web de référence?Comment se moquer WCF Web Services avec Rhino Mocks

je voudrais se moquer du client, mais l'interface client généré ne contient pas la méthode proche, qui est nécessaire pour terminer correctement le proxy. Si je ne pas utiliser l'interface, mais plutôt une référence concrète, j'avoir accès à la méthode proche, mais perdre la capacité à se moquer de la procuration.

Je suis en train de tester une classe semblable à ceci:

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

Répondre

1

je crée une autre interface qui hérite de votre ILoggingServiceClient, mais ajoute la méthode Close. Créez ensuite une classe wrapper qui enveloppe l'instance LoggingServiceClient. Quelque chose comme:

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

Maintenant votre carte de service peut utiliser IDisposableLoggingServiceClient.

0

Dans mon expérience le temps nécessaire pour tester quelque chose comme ça n'est pas vraiment la peine. Bien fait votre adaptateur devrait être la plupart du temps juste faire un passage à travers puisque son but principal est de fournir une couture d'essai pour appeler le code. À ce stade, c'est un peu comme les propriétés et les points de vue. Vous n'avez pas besoin de les tester car vous pouvez inspecter visuellement le code et c'est tellement simple que vous savez que c'est juste.

0

C'est un peu en retard, mais je regardais juste des façons de contourner cela. Parce que la classe client généré automatiquement est généré en tant que partielle, vous pouvez l'étendre comme ceci:

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

public partial class LoggingServiceClient : ICloseableLoggingServiceClient 
{ 

} 

maintenant votre LoggingServiceClient a uni la méthode Close de la ClientBase<> et quel que soit votre contrat de service précise et vous devriez être en mesure de se moquer le ICloseableLoggingServiceClient avec RhinoMocks. Tout ce que vous devez faire est de vous assurer que vous injectez et testez sur la nouvelle interface au lieu de la classe client concrète.

Questions connexes