2010-08-01 11 views
5

Necesito algunos consejos sobre cómo usar Moq en una prueba unitaria para asegurarme de que mi clase bajo prueba se comporta como yo quiero. Esa es la clase bajo prueba publica un evento de Aggregator de eventos (de Prism) y necesito alguna manera de afirmar que este evento se ha planteado en mi prueba.Mocking Prism Event Aggregator using Moq for Unit Testing

No tengo muchos recursos en el trabajo y me resulta difícil saber cómo configurar esto.

que tienen: -

public SomeEvent : CompositePresentationEvent<SomeEvent> 
{ 
    EventPayload 
} 

public SomeClass 
{ 
    void Allocate(){EventAggregator.Publish<SomeEvent>} 
} 

public SomeService : IService 
{ 
    SomeService(){ EventAggregator.Subscribe<SomeEvent>(DoSomething)} 
    void DoSomething(SomeEvent evt){} 
} 

Creo que si mi prueba es para SomeClass necesito para verificar que si llamo SomeClass.Allocate se publica un mensaje algunEvento. ¿Cómo se hace esto?

¿También necesito verificar que SomeService se está burlando de SomeEvent? ¿O es una prueba de unidad separada que pertenece a SomeService unit test y no SomeClass?

En cualquier caso, no estoy seguro de cómo configurar algo de esto, así que cualquier consejo sería apreciado.

Respuesta

8

Se podría suministrar SomeClass con un IEventAggregator, lo que permitirá que se les suministre una maqueta durante la prueba:

public SomeClass(IEventAggregator eventAggregator) 
{ 
    _eventAggregator = eventAggregator; 
} 

A continuación, la prueba sería algo como esto:

var fakeEventAggregator = new Mock<IEventAggregator>(); 
var fakeEvent = new Mock<SomeEvent>(); 

fakeEventAggregator. 
    Setup(x => x.GetEvent<SomeEvent>()). 
    Returns(fakeEvent.Object); 

var test = new SomeClass(fakeEventAggregator.Object); 
test.Allocate(); 

fakeEvent.Verify(x => x.Publish(It.IsAny<SomeEventArgs>())); 

Si se trata de la unidad pruebas, entonces probaría la suscripción por completo en las pruebas SomeService. Está probando que SomeClass publica correctamente un evento y que SomeService se comporta correctamente cuando se le asigna un evento para procesar.

+0

Este ejemplo utiliza "Inyección de dependencia de constructor", ya que la dependencia de IEventAggregator se inyecta durante el constructor SomeClass. –

+0

Una gran respuesta, esto me ayudó mucho. – user630190