单元测试类型正确的注册
作者:互联网
我有一个非常简单的微服务,在大多数情况下,我不会运行,而是依靠单元测试和集成测试来确认实现是正确的并且可以工作.最近,我进行了更改,并通过了单元测试,因此将其部署到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