Как-макет MSMQ MessageQueue - PullRequest
       8

Как-макет MSMQ MessageQueue

16 голосов
/ 27 октября 2009

Я хочу провести модульное тестирование моего приложения, которое использует 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.

1 Ответ

30 голосов
/ 27 октября 2009

Итак, основная проблема здесь в том, что вы сильно зависите от объекта 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, и протестировать его функциональность.

...