Подтвердить что ты не робот

How-To Mock MSMQ MessageQueue

Я хочу Unit Test мое приложение, которое использует MSMQ, но я не нашел пути для создания объектов Mock MessageQueue.

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

Я использую Moq с xUnit.

4b9b3361

Ответ 1

Итак, основная проблема заключается в том, что у вас есть жесткая зависимость от объекта MessageQueue. Обычно, когда у меня такая ситуация, я создам интерфейс, такой как IQueue, а затем создаю реализацию IQueue для MessageQueue.

Затем вы можете ввести зависимость IQueue с помощью Moq и проверить, что ваш класс функционирует должным образом.

Что-то вроде этого:

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

Теперь вы можете вставить объект IQueue с помощью moq в этот класс, который зависит от объекта MessageQueue и проверки функциональности.