簡體   English   中英

MVVM單元測試-消息總線僅工作一次

[英]MVVM unit tests - message bus only works once

我正在嘗試使用SimpleMvvmToolkit針對視圖模型編寫一些單元測試,並且其中一些測試需要將消息發送到消息總線以引發視圖模型內部的事件。 問題在於,我只能“使用”消息總線一次; 發送消息的第一個測試通過,但是發送消息的其他兩個測試失敗。 但是,如果我分別運行每個測試,則所有三個測試都通過了;如果更改順序,則第一個測試(無論是哪個測試)都將通過。

這是其中一項測試的樣本。

[TestMethod]
public void DeleteRequest()
{
    // mock the driver transaction service

    var driverTransactionService =
         new Mock<Services.IDriverTransactionService>();

    var viewModel = new ValidationRequestViewModel(
         driverTransactionService.Object);

    driverTransactionService.Setup(dts =>
         dts.DeleteValidationRequest(It.IsAny<Action<int>>(), 
              It.IsAny<Action<Exception>>(),
              It.IsAny<int>()))
        .Callback((Action<int> action, Action<Exception> ex, int id) => 
             action.Invoke(requestId));

    // make a validation request and add to the collection

    var validationRequest = new ValidationRequest...

    var collection = viewModel.ValidationRequestView.SourceCollection as 
         ObservableCollection<ValidationRequest>;

    collection.Add(validationRequest);

    //  delete the validation request; send the confirmation message as if
    //  the user clicked yes

    viewModel.DeleteValidationRequest(validationRequest);

    MessageBus.Default.Notify(
         NotificationMessages.DeleteValidationRequestConfirmation, 
         this, new NotificationEventArgs<String>(null, null));

    // verify the service call was made

    driverTransactionService.Verify(dts => 
         dts.DeleteValidationRequest(It.IsAny<Action<int>>(), 
              It.IsAny<Action<Exception>>(), requestId));
}

因此,我正在創建服務的模擬(它是WCF服務的包裝器),並驗證是否正在調用該服務上的DeleteValidatonRequest。 在這種情況下,需要消息總線,因為如果用戶單擊“確定”,通常會彈出一個確認對話框,並發送DeleteValidationRequestConfirmation消息。

測試在最后一行(Verify)失敗,並且在我調試時,視圖模型中消息的處理程序永遠不會執行,因此看起來消息從未真正發送過。 同樣,只有在測試不是將消息發送到總線的第一個測試時,測試才會失敗。 如果它是單獨執行還是第一次執行,則測試通過。

有任何想法嗎? 所有測試都是獨立的,並且不共享測試類的任何屬性或變量,因此我看不到它們之間如何相互影響。

編輯:我使用反射在消息通常會觸發的視圖模型上調用受保護的方法; 這使我獲得了所需的代碼覆蓋率,只是沒有驗證視圖模型是否正確響應了消息。

編輯2:廢話,視圖模型上的PropertyChanged事件也發生了同樣的事情。 僅當測試是獨立運行還是第一次運行時,事件處理程序才會觸發。

我不熟悉SimpleMvvmToolkit,但是我熟悉消息傳遞的概念。

不要使用MessageBus.Default 修改ViewModel使其具有MessageBusIMessageBus如果存在)構造函數參數。 現在,您的測試將被隔離,因此您可以一次運行所有測試,它們應該通過。

此外,如果存在IMessageBus接口,則可以模擬它,這將使測試ViewModel更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM