asp.net-core - 如何在 ASP.NET Core 3.1 中使用简单注入(inject)器进行依赖交换以进行集成测试

标签 asp.net-core dependency-injection asp.net-core-mvc integration-testing simple-injector

我正在努力在 ASP.NET Core 3.1 应用程序中使用 SimpleInjector (4.9) 设置 DI 进行集成测试,以便我可以根据标准 ASP 依赖交换在 Startup 类中注册的目标配置服务.NET Core启动配置。

我想要实现的基本上是这样的:

  1. 使用 Microsoft.AspNetCore.TestHost.TestServer(或等效项)“托管”测试
  2. 将启动初始化为“正常”,因此无需为测试和运行时维护单独的 IoC
  3. 使用模拟交换/覆盖关键依赖项,例如对外部服务和 RabbitMQ 的 API 调用
  4. 使用启动配置和模拟来运行测试

我的问题是,我似乎找不到与 SI 容器交互以使其覆盖依赖项的方法,类似于 Adam Storr solved it 。我尝试从 Adam Storr、Andrew Lock、Gunnar Peipman 发布的指南以及官方文档中收集灵感,但无论我如何尝试将解决方案与 SimpleInjector 结合起来,总会有一些关键的东西不起作用。

我无法访问 Startup 中创建的容器并让它更改依赖项,因为 Startup 是由 .UseStartup 生成的,即使如此,也意味着以某种复杂的方式公开 Startup 类。自 that's not supported anymore 以来,我也无法将容器注入(inject)到启动中。

但是,如果我尝试创建 Startup 的子类并使用它,我最终会遇到默认情况下找不到 Controller 的问题,因此 Http(Test)Client 返回 404。如果我尝试按照 Gunnar Peipman's suggestion 解决此问题SimpleInjector 失败并显示:

System.InvalidOperationException:为了使 SimpleInjectorControllerActivator 正常运行,它需要在 Simple Injector 中显式注册所有 Controller ,但缺少 WeatherForecastController 的注册。为了确保所有 Controller 都正确注册,请在提供 IApplicationBuilder 实例时从 Startup.Configure 方法中调用 Container 上的 RegisterMvcControllers 扩展方法,例如“this.container.RegisterMvcControllers(app);”

(这甚至不是解决这个问题的最新方法,因为 RegisterMvcControllers(app) 已被弃用,取而代之的是 AddControllerActivation - ref )

我已上传示例存储库 here显示问题;此处的一些指导将不胜感激。

最佳答案

经过进一步挖掘,我发现了阻止我所有尝试工作的问题:为了让您的集成测试注册 Controller ,您必须更改测试项目 SDK:

<Project Sdk="Microsoft.NET.Sdk">

致:

<Project Sdk="Microsoft.NET.Sdk.Web">

公平地说,prerequisites 下确实是这么说的。 ,但说实话,我认为测试项目模板没有附带已配置的内容,或者没有针对这种非常常见的场景的特定模板,或者我没有任何指南,这太奇怪了发现提到了这个关键的配置。如果您信任模板,很容易错过。

修复此问题后,现在可以非常简单地使用 Startup 的子类以及 SimpleInjector 进行模拟覆盖。

关于asp.net-core - 如何在 ASP.NET Core 3.1 中使用简单注入(inject)器进行依赖交换以进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60379940/

相关文章:

c# - 重定向到 ASP.NET Core 中的 URL

c# - ASP.NET Core API 版本控制 - 部分取代以前的方法版本

asp.net-core - EFCore 中的可查询<T>.Union 行为

java - 如何让RestTemplate永远不抛出异常

dependency-injection - Mono 兼容的依赖注入(inject)框架

unit-testing - Angular 2 RC4 : Unit test component that has dependency injection a service that has its own

c# - MVC6 - 如果(复选框勾选)则删除线

asp.net - 如何在 ASP NET MVC 6 中更新模型?

c# - 是否有可能从 url 映射数组?

javascript - 如何创建新的 .NET Core SPA Angular 2 项目