簡體   English   中英

我應該如何測試?

[英]How should I test this?

我有一個ViewModel,它在初始化時會創建一個對象列表。 這些對象是通過解決IoC的接口實現而創建的。

視圖模型

    public class ApplianceViewModel : IAppliance
    {
        private List<IHardware> HardwareItems {get; set;}

        public ApplianceViewModel()
        {
            HardwareItems = new List<IHardware>();
            var hardware1 = Constants.Kernel.Get<IHardware>();
            var hardware2 = Constants.Kernel.Get<IHardware>();

            HardwareItems.Add(hardware1);
            HardwareItems.Add(hardware2);           
        }
    }

單元測試

[TestClass]
public class ApplicanceViewModelTest
{
    [TestMethod]
    public void TestSomething()
    {
        //Arrange
        var appliance = new ApplianceViewModel(); //This would fail to construct

    }
}

由於kernel為空,因此上述初始化將失敗。 基本上,它告訴我擁有一個常量類並直接訪問內核是一個糟糕的設計。

但是,然后我將如何修改viewmodel的構造函數,以便初始化列表,換句話說,使其可測試?

謝謝。

但是然后我將如何修改我的viewmodel的構造函數,以便可以初始化列表,換句話說,使其可測試?

您將其與IHardware接口的實現一起注入:

public class ApplianceViewModel : IAppliance
{
    private List<IHardware> HardwareItems {get; set;}

    public ApplianceViewModel(IHardware hardware1, Hardware hardware2)
    {
        HardwareItems = new List<IHardware>();
        var hardware1 = hardware1;
        var hardware2 = hardware2;

        HardwareItems.Add(hardware1);
        HardwareItems.Add(hardware2);           
    }
}

因此,在運行時,您可以使用現有常量注入視圖模型:

var appliance = new ApplianceViewModel(Constants.Kernel.Get<IHardware>(), Constants.Kernel.Get<IHardware>());

...並且在您的單元測試項目中,您傳遞了相同接口的其他實現:

IHardware testHardware = new TestHardware();
var appliance = new ApplianceViewModel(testHardware, testHardware);

您將需要通過使您的測試通過的方式來實現此“ TestHardware”類。 使用模擬框架將很有用。 請參考以下鏈接以獲取有關此的更多信息: http : //codetunnel.io/what-is-a-mocking-framework-why-is-it-useful/

您可以具有另一個接口,即IHardwareStuff ,該接口將返回IHardware對象的列表。 IHardwareStuff作為參數傳遞給ViewModel的構造函數。 它由依賴項注入容器解決,您可以在需要時輸入測試實現。

通過這種分離,您可以將您的對象分為一個值對象和一個服務對象 通過執行new並將一些具體值傳遞給它來創建第一個。 后者是由依賴項注入容器創建的,沒有作為構造函數傳遞給它的具體值。

然后,您可以為兩個對象編寫單元測試。

對於良好且可測試的設計,最好讓構造函數不執行任何操作,驗證或變量分配。

我建議在ApplianceViewModel的構造函數中注入HardwareItems列表。

暫無
暫無

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

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