Question

Je souhaite effectuer des tests unitaires sur mes applications utilisant MSMQ, mais je n'ai trouvé aucun moyen de simuler des objets MessageQueue.

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

J'utilise Moq avec xUnit.

Était-ce utile?

La solution

Le problème de base est donc que vous avez une dépendance forte sur l’objet MessageQueue. En règle générale, lorsque je suis dans une situation comme celle-ci, je crée une interface, comme IQueue, puis une implémentation d'IQueue pour MessageQueue.

Ensuite, vous pouvez injecter la dépendance IQueue avec Moq et tester le fonctionnement de votre classe.

Quelque chose comme ça:

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

La mise en oeuvre ressemblerait à ceci:

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

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

Ensuite, pour votre classe, cela dépend de MessageQueue, par exemple:

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

Vous pouvez maintenant injecter un objet IQueue à l'aide de moq dans cette classe qui dépend de l'objet MessageQueue et tester la fonctionnalité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top