2010-08-01 23 views
5

Test ettiğim sınıfın istediğim gibi çalıştığından emin olmak için, bir birim sınamasında Moq'un nasıl kullanılacağı konusunda biraz tavsiyeye ihtiyacım var. Bu test altındaki sınıf bir Etkinlik Toplayıcı (Prism) etkinliğinden yayınlar ve bu olayın benim testimde ortaya çıktığını iddia etmem gerekiyor.Mocking Prism Event Agregatörü Birim Denetimi için Moq Kullanıyor

İşyerinde çok fazla kaynağım yok ve bunu nasıl ayarlayacağımı bilmek zor.

Ben: -

public SomeEvent : CompositePresentationEvent<SomeEvent> 
{ 
    EventPayload 
} 

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

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

Ben benim test SomeClass için ise ben SomeClass.Allocate çağırırsanız bir someEvent mesajı yayınladı olduğunu doğrulamak gerektiğini düşünüyorum. Bu nasıl yapılır?

Ayrıca alaylı bir SomeService'nin SomeEvent ürününü aldığını doğrulamam gerekir mi? Ya da SomeService birim testine ait olan ve bir kaç sınıf değil, ayrı bir birim testi mi?

Her halükarda bunun nasıl ayarlanacağından emin olamamak için herhangi bir tavsiyenin takdir edilmesi gerekir.

cevap

8

Sen test sırasında bir taklidini tedarik izin verecek olan bir IEventAggregator ile SomeClass sağlayacağını:

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

Sonra test böyle bir şey görünecektir:

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>())); 

bu birim ise Testler daha sonra, aboneliği SomeService testlerinde tamamen ayrı ayrı test edersiniz. SomeClass'un bir etkinliği doğru bir şekilde yayınladığını ve SomeService'un işlenmesi gereken bir olay verildiğinde doğru şekilde davrantığını test ediyorsunuz.

+0

Bu örnek, "Oluşturucu Bağımlılığı Enjeksiyonu" nu kullanır, çünkü IEventAggregator üzerindeki bağımlılık SomeClass kurucusu sırasında enjekte edilir. –

+0

Harika cevap, bu bana çok yardımcı oldu. – user630190