views:

275

answers:

1

Hi,

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.

+10  A: 

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.

lomaxx
word, All of my .NET projects seem to end up with these interface/wrappers for all of Microsoft's sealed classes (FileInfo, HttpContext, etc etc)
ryber
+1. This is also the accepted answer on the last 10 "How do I mock [Class X]?" questions. I'm not sure why people aren't picking up on this.
Anderson Imes