我想单元测试我使用MSMQ的应用程序,但我发现没有办法来模拟MessageQueue对象。
var queuePath = @".\Private$\MyQueue";
MessageQueue queue = null;
if (MessageQueue.Exists(queuePath))
{
queue = new MessageQueue(queuePath);
}
else
{
queue = MessageQueue.Create(queuePath);
}
我正在使用Moq和xUnit。
答案 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对象并测试功能。