在使用 Autofac 作为 IoC 容器,因为 Autofac 默认的创建时机是在主机运行时。而在此 Module 被 Load 时注入的对象的注入的时机,将会在单元测试 Fake 注入之后,这就意味着 Load 时注入的对象将会覆盖 Fake 的对象。可以通过调用 Autofac 的 PreserveExistingDefaults 方法解决覆盖的问题
在进行集成测试,需要注入一些 Fake 的或者 Mock 的等用来测试的对象,这些对象期望替换掉原有的业务逻辑的对象。而在使用 Autofac 框架,将因为对象创建时机的问题,而让单元测试不好玩
单元测试注入的顺序,是在业务对象注入之前,因此业务对象将会替换掉单元测试注入的对象
通过 PreserveExistingDefaults 方法,可以在框架判断,如果在此之前已有注册,那么将不再进行注册,代码如下
builder.RegisterType<Foo>().As<IFoo>()
// 通过 PreserveExistingDefaults 可以在已经注册过了的应用,不会被覆盖为 Foo 类型
// 在单元测试使用,单元测试注入了测试用的消费者,可以不被覆盖
.PreserveExistingDefaults();
此时就可以在单元测试中,通过如下代码注入 FakeFoo 对象
Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(