为什么当控制器在asp.net核心应用程序的独立程序集中时,TestServer无法找到控制器?

joe*_*oey 19 c# unit-testing asp.net-web-api asp.net-core-mvc asp.net-core

出于某种原因,当ASP.NET核心控制器在单独的程序集中创建时,TestServer在客户端发出请求时无法找到控制器操作.(导致404响应)为什么会这样?我该如何解决这个问题?以下是重现的步骤.

  1. 使用.NET核心创建新的ASP.NET Core WebAPI
  2. 在单独的项目中创建集成测试,并配置测试以使用TestServer()客户端并使测试成功运行.
  3. 现在,将控制器分离到其自己的共享库和在步骤1中创建的重构项目,以使用此共享库.
  4. 重新运行包含TestServer()类的测试.你现在会注意到它失败了.

请参阅以下链接以创建集成测试.使用ASP.NET Core进行集成测试

joe*_*oey 38

其实我现在找到了一个解决方案,请看下面的差异: 在此输入图像描述

听起来这可能是TestServer()类的错误以及它在测试运行期间如何托管应用程序.

以下是代码行,以防您无法在上面的图片中阅读.AddApplicationPart(Assembly.Load(new AssemblyName("WebApiToReproduceBug.Controllers")));

  • 让我的一天.您还应该在Github上提到相关问题:https://github.com/aspnet/Mvc/issues/5992 (4认同)
  • 您不必使用 Assembly.Load,下一个代码段也可以使用。ServiceHookController 来自您要测试的程序集。services.AddMvc() .AddApplicationPart(typeof(ServiceHookController).Assembly); (2认同)

dan*_*ers 29

对于那些在迁移到netcoreapp3.0.csproj期间遇到这种情况的人,我发现上述答案有效,但是您可以通过更改 .csproj 文件本身中的引用来更干净地做到这一点。

就我而言,我更改了第一行 XML

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

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

致谢:https : //github.com/aspnet/Mvc/issues/5992#issuecomment-395408983


Kar*_*ral 10

除了joey回答:没有必要调用Assembly.Load()来解决这个bug.您可以使用以下代码.ServiceHookController是一个单独的项目的类.


public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddApplicationPart(typeof(ServiceHookController).Assembly);
}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个。谢谢你! (2认同)

小智 10

如果您遵循MS 文档中先决条件,则会加载来自不同程序集的控制器。

在我的情况下,添加Microsoft.AspNetCore.Mvc.Testing NuGet 包解决了这个问题,我不再需要调用AddApplicationPart了。

  • 对 net5 有效。这应该是一个可以接受的答案。 (2认同)