2010-04-15 14 views
6

¿Cómo puedo probar una clase que utiliza clientes proxy generada por una referencia de servicio web?Cómo simular servicios web de WCF con Rhino Mocks

Me gustaría burlarme del cliente, pero la interfaz de cliente generada no contiene el método de cierre, que se requiere para terminar apropiadamente el proxy. Si no uso la interfaz, sino una referencia concreta, tengo acceso al método de cierre pero pierdo la capacidad de simular el proxy.

estoy tratando de probar una clase similar a esto:

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

Respuesta

1

que crearía otra interfaz que hereda de su ILoggingServiceClient pero añade el método Close. A continuación, cree una clase contenedora que ajuste la instancia de LoggingServiceClient. Algo como:

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

Ahora su adaptador de servicio puede usar IDisposableLoggingServiceClient.

0

En mi experiencia, el tiempo requerido para probar algo como esto realmente no vale la pena. Hecho correctamente su adaptador debería estar simplemente haciendo un pase ya que su objetivo principal es proporcionar una costura de prueba para el código de llamada. En ese punto, son como propiedades y vistas. No necesita probarlos porque puede inspeccionar visualmente el código y es tan simple que sabe que es correcto.

0

Esto es un poco tarde, pero solo estaba buscando formas de evitar esto. Debido a que la clase de cliente generada automáticamente se genera como parcial se puede ampliar de esta manera:

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

public partial class LoggingServiceClient : ICloseableLoggingServiceClient 
{ 

} 

ahora su LoggingServiceClient ha unido el método Close del ClientBase<> y cualquiera que sea su contrato de servicio especifica y usted debería ser capaz de burlarse el ICloseableLoggingServiceClient con RhinoMocks. Todo lo que necesita hacer es asegurarse de que está inyectando y probando contra la nueva interfaz en lugar de la clase de cliente concreta.

Cuestiones relacionadas