2013-03-27 110 views
1

WPF & MVVM - 單元測試和消息框WPF和MVVM - 單元測試和彈出消息框或對話框

- 我寫在MVVM應用程序中使用至今了良好的效果。 但我正在ViewModel中工作,這引發了一個錯誤,我想向用戶展示這個錯誤,讓他們知道。


可以只是做我的視圖模型(VM)是這樣的:

MessageBox.Show(errorMessage); 

或者更可能是這樣的:

new ErrorMessageWindow(errorMessage).ShowDialog() 

,所以我可以樣式。

問題是我從VM創建一個UI彈出窗口。 我正在爲應用程序創建單元測試,該應用程序也彈出窗口並停止運行,直到手動關閉。

尋找一個好方法。

我正在考慮在虛擬機中引發事件 - 但由於View實際上並不知道虛擬機或其屬性,所以我不知道如何訂閱它。

我沒有使用任何外部框架 - 我寧願自己實現任何東西。

回答

4

我一般提供了viewmodel的一種方式來表示它需要提出一個錯誤。你可以通過依賴注入來完成它,將它傳遞給構造函數等。實現由包含應用程序或綁定視圖提供。

當您測試時,您接着傳遞「顯示錯誤消息」功能的測試實現,該功能僅驗證它是否被調用以及是否請求了正確的錯誤消息。理想情況下,您限制視圖模型將資源名稱和參數數組傳遞給格式字符串,以便它可以與國際化一起使用。

2

我會建議你遠離傳統的Win32 dialogs。如果有任何事情,最好在WPF中完成對話框,並使用例如綁定到布爾的可見性對話框從ViewModel提高它。這很容易測試,因爲您甚至不需要創建窗口管理器的模擬類。

關於如何在WPF中創建自己的彈出對話框的簡單示例here

您還可以使用對話服務here找到替代實現,以幫助您從ViewModel中移動創建對話框。這使您可以在單元測試期間模擬對話服務。

3

您應該對抽象進行處理,以便在單元測試期間替換實現。

例如,你可以有一個IWindowManager接口與ShowDialog方法,然後一個實現調用MessageBox(或您在生產過程中所需的任何技術),然後你可以使用一個隔離的框架或創建單元測試的測試執行它返回你想要的結果作爲你測試中的控制變量。

你真的應該考慮using an MVVM framework,並且類似Caliburn.Micro已經有一個IWindowManager接口。