2011-05-26 14 views
7

¿Cómo pruebo la unidad un método Business Layer que hace una llamada al servicio WCF?unidad prueba un método que llame al servicio wcf

ejemplo:

public void SendData(DataUnit dataUnit) 
{ 

     //this is WCF call 
     SomeServiceClient svc = new SomeServiceClient(); 

     svc.SomeMethod(dataUnit); 

} 

¿Hay alguna manera de burlarse SomeServiceClient en mi proyecto de prueba Unidad?

+0

lo que hago estos casos a utilizar Moq para burlarse de la interfaz de servicio. – Yaur

+1

Aquí no hay nada especial acerca de WCF (aunque el hecho de que la clase cliente implemente una interfaz puede ayudarlo). Este sería exactamente el mismo problema si 'SendData' necesita llamar a algún método de biblioteca de clases. –

+0

@Yakur: ¿Cómo le digo a NUnit Framework que si se llama SomeServiceClient, use este objeto simulado? Como SomeServiceClient se crea dentro del BL, no sé cómo lo paso. – Asdfg

Respuesta

12

Su problema aquí es que ha acoplado estrechamente Business Layer a su servicio WCF; en realidad crea una nueva instancia del cliente de servicio dentro de Business Layer, lo que significa que ahora es imposible llamar al método SendData sin llamar los métodos de servicio.

La mejor solución es introducir la inyección de dependencia en su arquitectura.

En su forma más simple, todo lo que hace es pasar una instancia de su clase de servicio en su Business Layer. Esto se hace a menudo en el tiempo de construcción de la clase usando un parámetro de constructor.

public class BusinessClass 
{ 
    private ISomeServiceClient _svc; 

    public BusinessClass(ISomeServiceClient svc) 
    { 
     _svc = svc; 
    } 

    public void SendData(DataUnit dataUnit) 
    { 
     _svc.SomeMethod(dataUnit); 
    } 
} 

Tenga en cuenta que el código anterior es un patrón de diseño, sin depender absolutamente de ningún marco como un contenedor de inversión de control.

Si la política de su empresa no es utilizar dichos marcos (por cierto, una política insana), puede inyectar manualmente sus instancias simuladas del servicio dentro de las pruebas de su unidad.

+0

no se puede usar el marco de dependencia en el proyecto. Política de la compañía. :( – Asdfg

+7

Existe una diferencia entre la inyección de dependencia como un patrón arquitectónico y el uso de un marco DI o un contenedor IOC. –

+0

excelente respuesta. Realmente agradezco su ayuda. – Asdfg

1

Usted debe separar su llamada de servicio de su capa de negocio:

Uso de la demostración a continuación, el método de la Capa de negocios que la lista ahora se vería así:

public void SendData(IMyInterface myInterface, DataUnit dataUnit) 
{ 

     myInterface.SomeMethod(dataUnit); 

} 

Pass en un RealThing si querer hacer la llamada de servicio, pasar en un TestThing si lo que desea es realizar una prueba:

public interface IMyInterface 
{ 
    void SomeMethod(DataUnit x); 
} 

public class RealThing : IMyInterface 
{ 
    public void SomeMethod(DataUnit x) 
    { 
     SomeServiceClient svc = new SomeServiceClient(); 
     svc.SomeMethod(x); 
    } 
} 

public class TestThing : IMyInterface 
{ 
    public void SomeMethod(DataUnit x) 
    { 
     // do your test here 
    } 
} 
+0

¿Esto no me hará implementar SomeMethod en dos lugares? cambiar algo en la clase RealThing, puede que tenga que venir y cambiar lo mismo en SomeTeth de TestThing. ¿Me estoy equivocando? – Asdfg

Cuestiones relacionadas