繁体   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