2010-08-01 86 views
5

我需要一些關於如何在單元測試中使用Moq的建議,以確保我的課程能夠以我想要的方式運行。這是被測試的課程發佈了一個Event Aggregator(來自Prism)事件,我需要某種方式來斷言這個事件在我的測試中已經提出。使用Moq進行單元測試的嘲諷Prism Event Aggregator

我在工作中沒有太多的資源,並且發現很難知道如何設置它。

我: -

public SomeEvent : CompositePresentationEvent<SomeEvent> 
{ 
    EventPayload 
} 

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

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

我想,如果我的測試是SomeClass的我需要驗證,如果我叫SomeClass.Allocate被髮表SomeEvent消息。這是如何完成的?

我是否還需要驗證模擬的SomeService是否正在接收SomeEvent?或者是屬於SomeService單元測試而不是SomeClass的單​​獨單元測試?

無論如何,不​​知道如何設置任何這個,所以任何意見將不勝感激。

回答

8

你會提供SomeClassIEventAggregator,這將允許您在測試過程中提供一個模擬:

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

那麼你的測試將是這個樣子:

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

如果這些單元然後您將在SomeService測試中完全單獨測試訂閱。您正在測試SomeClass是否正確發佈了一個事件,並且SomeService在給定要處理的事件時的行爲正確。

+0

本示例使用「構造函數依賴注入」,因爲在SomeClass構造函數期間注入對IEventAggregator的依賴。 – 2010-11-12 13:50:16

+0

很好的答案,這幫了我很多。 – user630190 2012-03-20 13:15:31