C# Unity IoC-单元测试类型注册是否正确

C# Unity IoC-单元测试类型注册是否正确,c#,unit-testing,unity-container,C#,Unit Testing,Unity Container,我有一个非常简单的微服务,在大多数情况下,我不运行它,而是依靠单元测试和集成测试来确认实现是正确的并且可以工作。最近,我做了一个更改,单元测试通过了,所以它被部署到了CI环境中(稍后会运行集成测试,这可能会告诉我问题出在哪里)。在unity组件的注册中,我创建了一个工厂并传递了一组数组参数,示例如下: var container = new UnityContainer(); container.RegisterType<IMyType, MyImpl1>(nameof(MyImp

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

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)),
        ));
var container=newunitycontainer();
RegisterType(nameof(MyImpl1));
RegisterType(nameof(MyImpl2));
RegisterType(nameof(MyImpl3));
container.RegisterType(
新注入构造函数(新参数)(
新解析参数(名称(MyImpl1)),
新的解析参数(名称(MyImpl2)),
新解析参数(名称(MyImpl3)),
));
对于那些目光敏锐的读者来说,您已经发现了上一个解析参数上的错误,这基本上就是我想要测试的-当然,我可以在try-catch中包装依赖项的寄存器并记录失败事件,但我想在部署它之前捕获它


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

因此,根据@camilo terevinto的评论,当你注册依赖项时,它将使用nunit测试抛出下面的异常简化版本:

[Test]
public void AssertThatDependenciesCorrectlyMap()
{
    Assert.DoesNotThrow(() => 
    {
        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)),
                ));
    }
}
[测试]
公共无效资产DependenciesCorrectlyMap()
{
Assert.DoesNotThrow(()=>
{
var container=new UnityContainer();
RegisterType(nameof(MyImpl1));
RegisterType(nameof(MyImpl2));
RegisterType(nameof(MyImpl3));
container.RegisterType(
新注入构造函数(新参数)(
新解析参数(名称(MyImpl1)),
新的解析参数(名称(MyImpl2)),
新解析参数(名称(MyImpl3)),
));
}
}

一种方法是首先将依赖项注册移动到它自己的类中,不管该容器支持哪种特定版本—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));
    }
}
现在,在单元测试中,您可以将扩展添加到容器中,并测试您是否能够解析特定的依赖项

using (var container = new UnityContainer())
{
    var extension = new MyUnityExtension();
    container.AddExtension(extension);
    var resolved = container.Resolve<IMyType>();
    Assert.IsNotNull(resolved);
}
使用(var container=new UnityContainer())
{
var extension=new MyUnityExtension();
容器。附加扩展(扩展);
var resolved=container.Resolve();
Assert.IsNotNull(已解析);
}

同时,您可以打包依赖项注册,这样宿主应用程序就可以只提供一些特定于环境的值,而不必配置容器本身。

那么,您有什么问题要测试呢?测试容器注册似乎并不难works@CamiloTerevinto为什么要删除“谢谢”和“ps”?总之,我不想知道服务A是否映射到接口A,但我想知道总体上是否存在问题。例如,如果您的依赖项存在问题,并且您运行应用程序时,您会看到死亡的黄屏。我想知道该YSOD是否会出现在单元测试中。YSOD意味着引发了未处理的异常,因此该异常将被单元捕获test@CamiloTerevinto-感谢您在这方面的帮助-结果证明解决方案非常简单!我喜欢这个,我可能会在以后查看它,以确保依赖关系得到解决。我还喜欢使用UnityContainerExtension-不知道它的存在和创建我自己的一个非常简单的实现。也就是说,我有很多依赖项(即使它是一个微服务),我真的不想测试每一个!
using (var container = new UnityContainer())
{
    var extension = new MyUnityExtension();
    container.AddExtension(extension);
    var resolved = container.Resolve<IMyType>();
    Assert.IsNotNull(resolved);
}