如何模拟MSMQ MessageQueue

时间:2009-10-26 22:16:51

标签: unit-testing msmq moq

我想单元测试我使用MSMQ的应用程序,但我发现没有办法来模拟MessageQueue对象。

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

我正在使用Moq和xUnit。

1 个答案:

答案 0 :(得分:30)

所以这里的基本问题是你对MessageQueue对象有很强的依赖性。通常当我遇到这种情况时,我会创建一个接口,比如IQueue,然后为MessageQueue创建一个IQueue实现。

然后,您可以使用Moq注入IQueue依赖项,并测试您的类是否按预期运行。

这样的事情:

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

实施将是这样的:

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

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

然后对于依赖于MessageQueue的类来说,这样:

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

现在,您可以使用moq将IQueue对象注入此类,该类依赖于MessageQueue对象并测试功能。