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

时间:2017-04-27 23:42:05

标签: c# unit-testing asp.net-web-api asp.net-core asp.net-core-mvc

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

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

4 个答案:

答案 0 :(得分:31)

其实我现在找到了一个解决方案,请看下面的差异: enter image description here

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

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

答案 1 :(得分:8)

除了乔伊回答: 无需调用Assembly.Load()即可解决此错误。您可以使用下面的代码。 ServiceHookController是来自单独项目的课程。


public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddApplicationPart(typeof(ServiceHookController).Assembly);
}

答案 2 :(得分:2)

对于那些在迁移到netcoreapp3.0期间遇到此问题的人,我发现上述答案有效,但是您可以通过更改.csproj文件本身中的引用来更干净地完成此操作。

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

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

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

信用至:https://github.com/aspnet/Mvc/issues/5992#issuecomment-395408983

答案 3 :(得分:1)

如果遵循pre-requisites from the MS documentation,则会加载来自单独程序集的控制器。

就我而言,添加Microsoft.AspNetCore.Mvc.Testing NuGet package解决了该问题,我不再需要致电tbl like/love te be defined, but I think a table with: id id_from id_to type (like/love/other)