【问题标题】:Why is TestServer not able to find controllers when controller is in separate assembly for asp.net core app?为什么当控制器位于 asp.net 核心应用程序的单独程序集中时,TestServer 无法找到控制器?
【发布时间】:2017-04-27 23:42:05
【问题描述】:

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

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

请参阅以下链接以创建集成测试。 Integration testing w/ ASP.NET Core

【问题讨论】:

  • 不确定但听起来不对.. 你确定你在测试中没有一些逻辑可能正在对程序集进行一些反思。
  • @loneshark99,我现在找到了解决方法。有关详细信息,请参阅下面的屏幕截图。同样,这看起来像是 TestServer 的一个错误
  • 这就是我在评论中所说的:)
  • 你很亲密,我会给你的。 :) 有关查找具有控制器的程序集(可能是控制器工厂)的逻辑似乎封装在 Microsoft.AspNetCore.TestHost 程序集中
  • 顺便问一下,你是为这个项目做贡献还是只是为了学习

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


【解决方案1】:

实际上我现在找到了解决方案,请参阅下面的差异:

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

这是代码行,以防您无法在图片中阅读上面的内容

.AddApplicationPart(Assembly.Load(new AssemblyName("WebApiToReproduceBug.Controllers"))); 

【讨论】:

  • 让我开心。您还应该在 Github 上提及相关问题:github.com/aspnet/Mvc/issues/5992
  • 你救了我的命。
  • 请注意,如果您使用 AddControllersAsServices 在容器中注册控制器,则应首先调用 AddApplicationPart。
  • 您不必使用 Assembly.Load,下一个 sn-p 也可以工作。 ServiceHookController 来自您要测试的程序集。 services.AddMvc() .AddApplicationPart(typeof(ServiceHookController).Assembly);
【解决方案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

【讨论】:

  • 但是如果我在我的测试项目中更改该行,我会得到一个“程序不包含适合入口点的静态'Main'方法”。
  • 我想我是在我的 *.Web.Tests 项目中这样做的,但我不记得了。似乎需要清理解决方案,然后是重建解决方案的一类问题。
  • 这对我有用。新的 3.1 应用程序,而不是迁移。
  • OMFG。我连续 2 多天一直在寻找您的答案。非常感谢!
【解决方案3】:

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


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

【讨论】:

  • 我更喜欢这个。谢谢!
【解决方案4】:

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

在我的情况下,添加Microsoft.AspNetCore.Mvc.Testing NuGet package 解决了这个问题,我不需要再打电话给AddApplicationPart

【讨论】:

  • 对 net5 有效。这应该是一个公认的答案。
猜你喜欢
  • 2019-02-02
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多