Domanda

Voglio testare la mia applicazione che usa MSMQ ma non ho trovato alcun modo per deridere gli oggetti MessageQueue.

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

Sto usando Moq con xUnit.

È stato utile?

Soluzione

Quindi il problema di base qui è che hai una forte dipendenza dall'oggetto MessageQueue. Generalmente quando ho una situazione come questa, creo un'interfaccia, come IQueue, quindi creo un'implementazione di IQueue per MessageQueue.

Quindi puoi iniettare la dipendenza IQueue con Moq e verificare che la tua classe funzioni come previsto.

Qualcosa del genere:

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

L'implementazione sarebbe qualcosa del genere:

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

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

Quindi per la tua classe che dipende da MessageQueue qualcosa del genere:

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

Ora puoi iniettare un oggetto IQueue usando moq in questa classe che dipende dall'oggetto MessageQueue e testarne la funzionalità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top