Frage

Ich möchte Unit Test meine Anwendung, die MSMQ verwenden, aber ich fand keinen Weg, um Mock Message Objekte.

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

Ich verwende Moq mit xUnit.

War es hilfreich?

Lösung

Also hier das Grundproblem ist, dass Sie eine harte Abhängigkeit vom Message Objekt haben. Im Allgemeinen, wenn ich eine Situation wie diese habe, ich werde eine Schnittstelle schaffen, wie iQueue und dann eine Implementierung von iQueue für Message erstellen.

Dann können Sie die iQueue Abhängigkeit mit Moq injizieren und zu testen, dass Ihre Klasse funktioniert wie erwartet.

So etwas wie folgt aus:

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

Die Umsetzung wäre so etwas wie dies:

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

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

Dann für Ihre Klasse, die auf dem Message etwas wie folgt ab:

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

Jetzt können Sie ein iQueue Objekt mit moq in diese Klasse injizieren, die auf dem Message Objekt abhängig ist und die Funktionalität testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top