简单的注射器:如何测试注册?

时间:2016-06-22 09:35:54

标签: c# simple-injector

我正在使用SimpleInjector并使用非常先进的注册技术,并且可能会使用一些扩展点来进行更多预付款注册(请参阅下面的动机)。这引发了编写单元测试的需要,该单元测试验证容器是否正确引导。例如,假设类型A1和& A2依赖于服务B,服务B由C1和C2实现,因此A1应注入C1,A2应注入C2。我想编写一个测试,用于验证不合格的A1在解析时注入C1,而A2注入C2。虽然我可以从A1和A2公开所有注入服务的公共属性来验证它们在测试中的类型,但我不是仅仅为了测试而这样做。是否有一个简单的API来测试如何解析对象图,也许是基于诊断API的东西,它似乎也是为了调试视图而做同样的事情?

动机:预付​​款注册背后的动机是通过基于注入上下文替换/装饰注入服务来实施设计和架构决策。这对我来说非常有利于保持应用程序代码的简单性和可测试性,将所有“if-then-else”复杂性放在容器注册级别中,并使应用程序代码保持真正的SOLID,同时几乎只对容器注册进行更改。这个想法的灵感来自于.Net Junkie关于命令&amp ;;的3个帖子。查询和装饰器的使用,以及基于编译时或运行时上下文应用某些装饰器的能力,这对于SOLID设计来说非常强大和有用。

1 个答案:

答案 0 :(得分:2)

  

是否有一个简单的API来测试如何解析对象图,也许基于诊断API的东西似乎是为了调试视图而做同样的事情?

是的,有几种方法可以做到这一点。我想到的两个选项是VisualizeObjectGraph上的GetRelationshipsInstanceProducer. Both allow visualizing object graphs.方法GetRelationships gives you a structured graph that you can iterate over, while VisualizeObjectGraph`以字符串格式返回对象图,类似于C#。

示例:

var container = new Container();

// Do registrations

// You need to verify to get the correct output of those methods
container.Verify();

var r = container.GetRegistration(typeof(A1));

Console.WriteLine(r.VisualizeObjectGraph());

这会输出类似

的内容
A1(
    FileLogger(
        Dependency1(),
        Dependency2()),
    C1(
        Dependency1(),
        SomeService()));

使用GetRelationships()时,您可以递归遍历图形并检查给定类型是否是注册的(子)依赖项。

示例:

// Useful extension method
private static IEnumerable<InstanceProducer> GetDependencies(this InstanceProducer p) {
    foreach (var r in p.GetRelationships()) {
        yield return r.Dependency;
        foreach (var d in r.Dependency.GetDependencies()) {
            yield return d;
        }
    }
}

var container = new Container();

// Do registrations

// You need to verify to get the correct output of those methods
container.Verify();

var deps = container.GetRegistration(typeof(A1)).GetDependencies();

Assert.IsTrue(deps.Any(p => p.Registration.ImplementationType == typeof(C1)));

请注意,尽管我认为您应该尽可能地限制这些类型的注册检查,因为:

  • 注册应该足够表达,编写测试只会重复您在组合根目录中定义的内容。
  • 更广泛的集成测试应该已经涵盖了功能级别的大部分场景。
  • Simple Injector的验证和诊断功能将为您发现常见的错误配置。
相关问题