2009-10-26 12 views
16

Quiero probar mi unidad de unidad que utiliza MSMQ, pero no encontré manera de simular objetos MessageQueue.How-To Mock MSMQ MessageQueue

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

Estoy usando Moq con xUnit.

Respuesta

29

Así que el problema básico aquí es que tiene una dependencia fuerte en el objeto MessageQueue. En general, cuando tengo una situación como esta, crearé una interfaz, como IQueue y luego crearé una implementación de IQueue para MessageQueue.

Luego puede inyectar la dependencia de IQueue con Moq y probar que su clase está funcionando como se esperaba.

Algo como esto:

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

La implementación sería algo como esto:

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

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

Luego de su clase que depende de la MessageQueue algo como esto:

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

Ahora puede inyectar un objeto IQueue usando moq en esta clase que depende del mensaje Poner en cola el objeto y probar la funcionalidad.

+2

word, Todos mis proyectos .NET parecen terminar con estas interfaces/envolturas para todas las clases selladas de Microsoft (FileInfo, HttpContext, etc etc.) – ryber

+3

+1. Esta también es la respuesta aceptada en los últimos 10 "¿Cómo me burlo [Clase X]?" preguntas No estoy seguro de por qué la gente no está aprendiendo sobre esto. –

+4

Parece que una clase contenedora funciona bien como solución, excepto para el método 'Crear' (que se supone que es estático), porque la firma para ese método devuelve' System.Messaging.MessageQueue', que no lo hace implementar 'IQueue'. ¿Alguien ha encontrado una solución para eso? –