Pregunta

Quiero hacer una prueba unitaria de mi aplicación que usa MSMQ, pero no encontré ninguna forma para burlarme de los objetos de MessageQueue.

        var queuePath = @".\Private$\MyQueue";
        MessageQueue queue = null;
        if (MessageQueue.Exists(queuePath))
        {
            queue = new MessageQueue(queuePath);
        }
        else
        {
            queue = MessageQueue.Create(queuePath);
        }

Estoy usando Moq con xUnit.

¿Fue útil?

Solución

Entonces, el problema básico aquí es que usted tiene una fuerte dependencia del objeto MessageQueue. En general, cuando tengo una situación como esta, crearé una interfaz, como IQueue, y luego crearé una implementación de IQueue para MessageQueue.

Luego puede inyectar la dependencia IQueue con Moq y probar que su clase funciona como se esperaba.

Algo como esto:

public interface IQueue
{
     bool Exists(string path);
     MessageQueue Create(string path);
}

La implementación sería algo como esto:

public MessageQueueImplementation : IQueue
{
    public bool Exists(string path)
    {
         return MessageQueue.Exists(path);
    }

    public MessageQueue Create(string path)
    {
         return MessageQueue.Create(path);
    }
}

Entonces, para su clase, eso depende de MessageQueue algo como esto:

public class DependentOnQueue
{
    private IQueue queue;
    //inject dependency
    public DependentOnQueue(IQueue queue)
    {
        this.queue = queue;
    }

    public MessageQueue CreateQueue(string path)
    {
         //implement method that you want to test here
    }
}

Ahora puede inyectar un objeto IQueue usando moq en esta clase que depende del objeto MessageQueue y probar la funcionalidad.

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