gpt4 book ai didi

c# - 简易喷油器 : How to test registrations?

转载 作者:行者123 更新时间:2023-11-30 23:24:09 25 4
gpt4 key购买 nike

我正在使用 Simple Injector 并使用非常先进的注册技术,并且可能会使用一些扩展点来实现更多的高级注册(请参阅下面的动机)。这就提出了编写单元测试以验证容器是否正确引导的需要。例如,假设类型 A1A2 依赖于 B 服务,它由 C1 实现>C2,这样 A1 应该用 C1 注入(inject),A2 应该用 C2 注入(inject).我想编写一个测试来验证 A1 在解析时注入(inject)了 C1 并且 A2 注入(inject)了 C2。虽然我可以公开来自 A1A2 的所有注入(inject)服务的公共(public)属性以在测试中验证它们的类型,但我宁愿不只是为了测试而这样做。是否有一个简单的 API 来测试如何解析对象图,也许是基于 Diagnostics API 的东西,它似乎为了调试 View 而做同样的事情?

动机:预注册背后的动机是通过基于注入(inject)上下文替换/装饰注入(inject)服务来实现设计和架构决策。这在保持应用程序代码简单和可测试方面非常有用,将所有“if-then-else”复杂性置于容器注册级别,并使应用程序代码真正可靠,同时几乎只对容器注册进行更改。这个想法的灵感来自 .NET Junkie's关于 commands 的帖子& queries以及装饰器的使用,以及基于编译时或运行时上下文应用某些装饰器的能力,这对于 SOLID 设计来说非常强大和有用。

最佳答案

Is there a simple API to test how an object graph would be resolved, perhaps something based on the Diagnostics API which seems to do the same for the purpose of debugging views?

是的,有几种方法可以做到这一点。我想到的两个选项是 InstanceProducer 上的 VisualizeObjectGraphGetRelationships 方法。两者都允许可视化对象图。 GetRelationships 为您提供可以迭代的结构化图,而 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 的验证和诊断功能将为您发现常见的错误配置。

关于c# - 简易喷油器 : How to test registrations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37964069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com