[英]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.