2016-02-22 55 views
4

我是C#和WPF的新手,所以我想從MVVM開始。 我有一個小的WPF應用程序,我想測試我的視圖模型是否在Designer模式下創建(檢查DesignerProperties);因爲我有一個IDataService,它可以從硬編碼列表(設計時間)或REST服務(運行時)向ViewModel提供數據。如何測試視圖模型是否在設計器模式或不在C#

有沒有辦法模擬或存根這個DesignerProperties對象強制它成爲一個或另一個狀態?

在此先感謝。

+0

可能的[WPF MVVM ViewModel構造函數設計模式]的副本(http://stackoverflow.com/questions/2498521/wpf-mvvm-viewmodel-constructor-designmode) –

+0

感謝Khale,但我的問題指向編寫單元測試(如果可能的話),而你的建議文章解釋瞭如何編寫視圖模型來檢查我想測試的場景(我已經在我的代碼中實現了)。 – CoderX

+0

我的錯 - 我誤解了你的要求。 –

回答

3

有沒有辦法模擬或存根這個DesignerProperties對象強制 它是一個或另一個狀態?

不是。它是靜態類;除非您使用「Microsoft Fakes」或「Type Mock」,否則無法輕鬆嘲笑。

但是您可以爲DesignerProperties創建一個抽象,如IDesignerProperties,它具有您感興趣的方法/屬性並注入它。這樣它現在只是一個界面;你可以像對待所有其他依賴項一樣嘲笑它。

+0

感謝Sriram,爲我節省了大量的Google搜索... – CoderX

+0

所以,你的意思是使用我自己的'定製'DesignerProperties'用我自己的'取代'原有的功能?只是想確定你的建議... – CoderX

+0

是的,創建你自己的類,它實現'IDesignerProperties'接口並添加所需的方法。 –

2

您可以爲靜態類創建一個包裝。我不熟悉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; 
    } 
} 

我希望這會幫助你。

+0

謝謝,這正是Sriram回答的澄清,清除了我對實現方面的疑惑。 – CoderX

相關問題