如何模拟MSMQ MessageQueue

Yoa*_*. B 16 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);
        }
Run Code Online (Sandbox Code Playgroud)

我正在使用Moq和xUnit.

lom*_*axx 30

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

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

像这样的东西:

public interface IQueue
{
     bool Exists(string path);
     MessageQueue Create(string path);
}
Run Code Online (Sandbox Code Playgroud)

实现将是这样的:

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

    public MessageQueue Create(string path)
    {
         return MessageQueue.Create(path);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么对于依赖于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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 包装类似乎可以作为解决方案工作,除了`Create`方法(顺便说一下它应该是静态的),因为该方法的签名返回一个`System.Messaging.MessageQueue`,它没有实现`IQueue`.有没有人想出一个解决方法呢? (4认同)
  • +1.这也是最后10个"我如何模拟[X类]?"的公认答案.的问题.我不确定为什么人们不会接受这个. (3认同)
  • 换言之,我所有的.NET项目似乎最终都会为所有Microsoft的密封类(FileInfo,HttpContext等)提供这些接口/包装器. (2认同)