Pregunta

Tengo una aplicación que usa un servicio WCF. Ahora me gustaría agregar pruebas unitarias a la aplicación.

Para algunos casos, necesito burlarme del servicio WCF, ya que obtener el comportamiento deseado del servicio a veces es difícil (por ejemplo, el servicio arroja excepciones especiales).

Podría agregar otra interfaz al cliente wcf, pero esto parece un poco tonto, ya que las llamadas del cliente ya están usando una interfaz.

¿Hay una manera fácil de burlarse de un servicio WCF? ¿Más fácil que crear otra capa de interfaz y redirigir cada llamada WCF dentro de ella?

Editar: La mayoría de las respuestas parecen no saber mucho sobre el uso del servicio WCF, por lo que algunas aclaraciones:
Para usar un servicio WCF desde un ViewModel, tengo que administrar la conexión de esta manera:

ChannelFactory<IMyWcfService> channelFactory = new ChannelFactory<IMyWcfService>("");
IMyWcfService proxy = channelFactory.CreateChannel();
proxy.CallMyStuff();
proxy.Close();

No puedo simplemente pasar el ViewModel el proxy al WCF, ya que la conexión debe abrirse y cerrarse para cada transacción. Por esta razón, usar RhinoMock / NMock no funcionaría, ya que necesitan un ViewModel que obtiene el proxy como parámetro, lo que no se puede hacer de esta manera si usa WCF.

¿Fue útil?

Solución

¿Por qué no puede usar algo como NMock2 para burlarse de las interfaces IMyWcfService directamente?

Si necesita poder crear nuevas instancias sobre la marcha, use Factory para ocultar el ChannelFactory<IMyWcfService> del cliente. De esta manera, puede reemplazar la fábrica, proporcionando al cliente uno que cree simulacros en lugar de servidores proxy reales.

Otros consejos

Puede usar cualquier marco de imitación como RhinoMocks o NMock para simular el contrato de interfaz, por lo que si su servicio implementó IMyService, podría usar un marco de imitación para establecer expectativas sobre las llamadas de método en esa interfaz. Si no está familiarizado con este concepto, simplemente puede crear un objeto sustituto que implemente IMyService pero que pretenda ser el servicio real durante su prueba. De esta manera, cuando se invocan los métodos, se invocan en su objeto suplente y puede hacer que su sustituto devuelva lo que quiera.

Puedes Moq burlarse del marco. Según el ejemplo que ha proporcionado:

ChannelFactory<IMyWcfService> channelFactory = new ChannelFactory<IMyWcfService>("");
IMyWcfService proxy = channelFactory.CreateChannel();
proxy.CallMyStuff();
proxy.Close();

Así es como se verá una implementación burlona:

Mock<IMyWcfServiceChannel> channelMock = new Mock<IMyWcfServiceChannel>(MockBehavior.Strict);
channelMock
    .Setup(c => c.CallMyStuff())
    .Returns("");

string myStuff = channelMock.Object.CallMyStuff();

Después de agregar un proxy para el servicio WCF, debe tener una interfaz channel disponible para usted, llamada IMyWcfServiceChannel.

Dependiendo del tipo de método de servicio al que está llamando, puede configurar casi cualquier salida. En el ejemplo anterior, usé string tipo como ejemplo.

Para utilizar la solución anterior de manera más eficiente, es posible que desee crear 2 constructores para la capa empresarial de la siguiente manera:

public class Example1
{
    IMyWcfServiceChannel _client;

    public Example1()
    {
        var factory = new ChannelFactory<IMyWcfServiceChannel>("binding");
        _client = factory.CreateChannel();
    }

    public Example1(IMyWcfServiceChannel client)
    {
        _client = client;
    }

    public string CallMyStuff()
    {
        return _client.CallMyStuff();
    }
}

Entonces, en el prod usas un constructor sin parámetros. En unit pruebas, utiliza el constructor de parámetros completos y le pasa simulacro (channelMock.Object).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top