2009-07-27 34 views
1

我使用複合WPF(棱鏡),我試圖單元測試,我的控制器確實訂閱複合事件。爲什麼我的Moq IEventAggregator驗證失敗?

我申購代碼如下...

//Init Events. 
this.eventAggregator.GetEvent<PlantTreeNodeSelectedEvent>().Subscribe(
    ShowNodeDetails, ThreadOption.UIThread); 

我的單元測試代碼如下(我用的起訂量爲我的模擬框架和統一作爲我的DI框架)...

Mock<PlantTreeNodeSelectedEvent> eventBeingListenedTo = new Mock<PlantTreeNodeSelectedEvent>(); 
eventAggregatorMock.Setup(e => e.GetEvent<PlantTreeNodeSelectedEvent>()).Returns(eventBeingListenedTo.Object); 


//Initialize the controller to be tested. 
IPlantTreeController controllerToTest = container.Resolve<IPlantTreeController>(); 


//Verify. 
eventBeingListenedTo.Verify(
    e => e.Subscribe(It.IsAny<Action<string>>(), ThreadOption.UIThread)); 

該訂閱方法被調用(我用調試器中運行驗證),但驗證總是失敗,「祈求並沒有對模擬進行:E => e.Subscribe ......」

一呃想知道我做錯了什麼?

回答

0

在您的代碼中,似乎從未使用eventAggregatorMock實例。我猜想你需要在容器中註冊它,以便controllerToTest使用它。

0
  1. 您似乎在單元測試中測試過多。你不應該需要一個容器,你應該創建你的控制器來提供模擬依賴關係,因爲你應該只在單元測試中測試1件事(你不需要像通常那樣測試DI框架的工作方式;-) )。它還將確保您提供正確的模擬,現在從您的代碼中可以看出,Mark Seemann在他的答案中指出了這一點。

  2. 您可能會嘗試在開始時設置一個方法調用問題。有時它似乎有助於moq適當地驗證課程。在這種情況下,您可能還希望在構造函數中將模擬行爲設置爲Strict,以便您可以針對其他意外調用模擬的測試失敗。


eventBeingListenedTo.Setup(e => e.Subscribe(It.IsAny<Action<string>>(), ThreadOption.UIThread));