我是C#和WPF的新手,所以我想從MVVM開始。 我有一個小的WPF應用程序,我想測試我的視圖模型是否在Designer模式下創建(檢查DesignerProperties);因爲我有一個IDataService,它可以從硬編碼列表(設計時間)或REST服務(運行時)向ViewModel提供數據。如何測試視圖模型是否在設計器模式或不在C#
有沒有辦法模擬或存根這個DesignerProperties對象強制它成爲一個或另一個狀態?
在此先感謝。
我是C#和WPF的新手,所以我想從MVVM開始。 我有一個小的WPF應用程序,我想測試我的視圖模型是否在Designer模式下創建(檢查DesignerProperties);因爲我有一個IDataService,它可以從硬編碼列表(設計時間)或REST服務(運行時)向ViewModel提供數據。如何測試視圖模型是否在設計器模式或不在C#
有沒有辦法模擬或存根這個DesignerProperties對象強制它成爲一個或另一個狀態?
在此先感謝。
有沒有辦法模擬或存根這個DesignerProperties對象強制 它是一個或另一個狀態?
不是。它是靜態類;除非您使用「Microsoft Fakes」或「Type Mock」,否則無法輕鬆嘲笑。
但是您可以爲DesignerProperties創建一個抽象,如IDesignerProperties
,它具有您感興趣的方法/屬性並注入它。這樣它現在只是一個界面;你可以像對待所有其他依賴項一樣嘲笑它。
您可以爲靜態類創建一個包裝。我不熟悉DesignerProperties
類,但我在下面創建了一個示例。同時考慮依賴注入/控制反轉,以便於單元測試。
靜態類
static class DesignerProperties
{
public bool IsInDesigner { get; }
public void DoSomething(string arg);
// Other properties and methods
}
依賴注入和嘲弄的接口。 (您可以通過靜態類的反射使用T4模板自動生成)
interface IDesignerProperties
{
bool IsInDesigner { get; }
void DoSomething(string arg);
// mimic properties and methods from the static class here
}
運行時使用
class DesignerPropertiesWrapper : IDesignerProperties
{
public bool IsInDesigner
{
get { return DesignerProperties.IsInDesigner; }
}
public void DoSomething(string arg)
{
DesignerProperties.DoSomething(arg);
}
// forward other properties and methods to the static class
}
嘲諷類實際的類進行單元測試
class DesignerpropertiesMock : IDesignerProperties
{
public bool IsInDesigner { get; set; } //setter accessible for Mocking
}
使用
class ViewModel
{
private readonly IDesignerProperties _designerProperties;
// Inject the proper implementation
public ViewModel(IDesignerProperties designerProperties)
{
_designerProperties = designerProperties;
}
}
我希望這會幫助你。
謝謝,這正是Sriram回答的澄清,清除了我對實現方面的疑惑。 – CoderX
可能的[WPF MVVM ViewModel構造函數設計模式]的副本(http://stackoverflow.com/questions/2498521/wpf-mvvm-viewmodel-constructor-designmode) –
感謝Khale,但我的問題指向編寫單元測試(如果可能的話),而你的建議文章解釋瞭如何編寫視圖模型來檢查我想測試的場景(我已經在我的代碼中實現了)。 – CoderX
我的錯 - 我誤解了你的要求。 –