其他分享
首页 > 其他分享> > 单元测试类型正确的注册

单元测试类型正确的注册

作者:互联网

我有一个非常简单的微服务,在大多数情况下,我不会运行,而是依靠单元测试和集成测试来确认实现是正确的并且可以工作.最近,我进行了更改,并通过了单元测试,因此将其部署到CI环境中(稍后运行集成测试,这可能告诉我问题出在哪里).在我的统一组件注册中,我创建了一个工厂,并传递了一组数组参数,例如以下示例:

var container = new UnityContainer();

container.RegisterType<IMyType, MyImpl1>(nameof(MyImpl1));
container.RegisterType<IMyType, MyImpl2>(nameof(MyImpl2));
container.RegisterType<IMyType, MyImpl3>(nameof(MyImpl3));

container.RegisterType<MyFactory>(
        new InjectionConstructor(new ResolvedArrayParameter<IMyType>(
            new ResolvedParameter<IMyType>(nameof(MyImpl1)),
            new ResolvedParameter<IMyType>(nameof(MyImpl2)),
            new ResolvedParameter<ISomeOtherType>(nameof(MyImpl3)),
        ));

对于那些眼花eagle乱的读者,您将在最后一个解析的参数上发现错误,而这本质上就是我要测试的内容-当然,我可以将依赖项的寄存器包装在try-catch中并记录a的事件.失败,但我想在部署之前捕获它.

因此,我的问题很简单(或者不是,我的谷歌搜索证明是一次巨大的失败),如何检查依赖关系是否能够正确解析并模拟应用程序的运行?

解决方法:

一种方法是首先将依赖项注册移到其自己的类中,无论该容器支持的特定版本是什么(Windsor设备,Unity扩展等).

这意味着我们不会在测试中复制容器设置.相反,我们正在测试与应用程序实际使用的容器设置相同的容器.

public class MyUnityExtension : UnityContainerExtension
{
    protected override void Initialize()
    {
        Container.RegisterType<IMyType, MyImpl1>(nameof(MyImpl1));
        Container.RegisterType<IMyType, MyImpl2>(nameof(MyImpl2));
        Container.RegisterType<IMyType, MyImpl3>(nameof(MyImpl3));
    }
}

如果希望应用程序提供特定于环境的值,则可以在接口或类中定义这些值,然后将其添加到构造函数中,然后根据需要在容器设置中使用这些设置中的值,如连接字符串.

public class MyUnityExtension : UnityContainerExtension
{
    private readonly ISettings _settings;

    public MyUnityExtension(ISettings settings)
    {
        _settings = settings;
    }

    ...etc
}

现在,在单元测试中,您可以将扩展名添加到容器中,并测试您是否能够解决特定的依赖关系.

using (var container = new UnityContainer())
{
    var extension = new MyUnityExtension();
    container.AddExtension(extension);
    var resolved = container.Resolve<IMyType>();
    Assert.IsNotNull(resolved);
}

同时,您还可以打包依赖项注册,以便托管应用程序仅可以提供一些特定于环境的值,而不必配置容器本身.

标签:unit-testing,unity-container,c
来源: https://codeday.me/bug/20191110/2013906.html