Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How-To Mock MSMQ MessageQueue

I want to Unit Test my application which use MSMQ but i found no way in order to Mock MessageQueue objects.

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

I'm using Moq with xUnit.

like image 330
Yoann. B Avatar asked Oct 26 '09 22:10

Yoann. B


1 Answers

So the basic problem here is that you have a hard dependency on the MessageQueue object. Generally when I have a situation like this, I'll create an interface, like IQueue and then create an implementation of IQueue for MessageQueue.

Then you can inject the IQueue dependency with Moq and test that your class is functioning as expected.

Something like this:

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

The implementation would be something like this:

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

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

Then for your class that depends on the MessageQueue something like this:

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
    }
}

Now you can inject an IQueue object using moq into this class that depends on the MessageQueue object and test the functionality.

like image 63
lomaxx Avatar answered Sep 24 '22 10:09

lomaxx