2010-08-26 59 views
2
[TestMethod()] 
    public void ShowSetup_SendsMessage_WhenShowSetupCommandCalled() 
    { 

     //Arrange 
     Messenger.Reset(); 
     MainViewModel target = new MainViewModel(); 
     bool wasCalled = false; 
     Messenger.Default.Register<NotificationMessage>(this,"Settings",(msg) => wasCalled = true); 

     //Act 
     target.ShowSetupCommand.Execute(null); 

     //Assert 
     Assert.IsTrue(wasCalled); 
    } 

我看到有一個IMessenger的界面,我試圖嘲弄並設置Messenger.OverrideDefault像這樣的模擬:這是測試MVVM-Light工具包消息的可接受方式嗎?

var mock = new Mock<IMessenger>();  
Messenger.OverrideDefault((Messenger)mock.Object); 

但我得到了一個無效的轉換錯誤。 OverrideDefault方法不是爲了這個目的,或者更可能是我錯誤地使用它。

或者我會爲接收消息和模擬這些類的接口嗎?我真正想測試的是RelayCommand在被調用時發送消息。

回答

3

我剛開始自己​​看看這個。 Messenger.OverrideDefault沒有將IMessenger作爲參數,我有點驚訝。你必須繼承Messenger。

我想你可以創建一個內部使用你的模擬對象,然後做一個驗證的類。

 [Test] 
    public void ShowSetup_SendsMessage_WhenShowSetupCommandCalled() { 
     Messenger.Reset(); 
     MaintenanceViewModel target = new MainViewModel(); 
     IMessenger mockMessenger = MockRepository.GenerateMock<IMessenger>(); 
     mockMessenger.Expect(m => m.Send("Settings")); 
     TestMessenger testMessenger = new TestMessenger(mockMessenger); 
     Messenger.OverrideDefault(testMessenger); 
     bool wasCalled = false; 
     Messenger.Default.Register<NotificationMessage>(this, "Settings", (msg) => wasCalled = true); 
     target.ShowSetupCommand.Execute(null); 

     mockMessenger.VerifyAllExpectations(); 
    } 

您可能需要也可能不需要Register方法的存根。

public class TestMessenger : Messenger { 
    private IMessenger _mockMessenger; 
    public TestMessenger(IMessenger mock) { 
     _mockMessenger = mock; 
    } 
    public override void Register<TMessage>(object recipient, bool receiveDerivedMessagesToo, Action<TMessage> action) { 
     _mockMessenger.Register<TMessage>(recipient, receiveDerivedMessagesToo, action); 
    } 

    public override void Register<TMessage>(object recipient, Action<TMessage> action) { 
     _mockMessenger.Register<TMessage>(recipient, action); 
    } 

    public override void Send<TMessage, TTarget>(TMessage message) { 
     _mockMessenger.Send<TMessage, TTarget>(message); 
    } 

    public override void Send<TMessage>(TMessage message) { 
     _mockMessenger.Send<TMessage>(message); 
    } 

    public override void Unregister<TMessage>(object recipient, Action<TMessage> action) { 
     _mockMessenger.Unregister<TMessage>(recipient, action); 
    } 

    public override void Unregister<TMessage>(object recipient) { 
     _mockMessenger.Unregister<TMessage>(recipient); 
    } 

    public override void Unregister(object recipient) { 
     _mockMessenger.Unregister(recipient); 
    } 
} 
0

另一種方法是使用構造器注入可以在這個answer看到:

的TestMessenger類。我認爲最好使用構造函數注入來代替使用靜態Messenger.Default。這是更強大的方法導致依賴注入提供自然縫,你可以很容易地在單元測試中替代依賴關係。如果您嘗試替換靜態成員調用,那麼您依賴於顯然可以更改的內部實現。

相關問題