Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当控制器位于asp.net核心应用程序的单独程序集中时,为什么TestServer无法找到控制器?_C#_Unit Testing_Asp.net Web Api_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

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

C# 当控制器位于asp.net核心应用程序的单独程序集中时,为什么TestServer无法找到控制器?,c#,unit-testing,asp.net-web-api,asp.net-core,asp.net-core-mvc,C#,Unit Testing,Asp.net Web Api,Asp.net Core,Asp.net Core Mvc,由于某些原因,当ASP.NET核心控制器在单独的程序集中创建时,当客户端发出请求时,TestServer无法找到控制器操作。(导致404响应)这是为什么?我怎样才能解决这个问题? 下面是复制的步骤 使用.NET Core创建新的ASP.NET Core WebAPI 在单独的项目中创建集成测试,并将测试配置为使用TestServer()客户端并使测试成功运行 现在,将控制器分离到它自己的共享库中,并重构在步骤1中创建的项目以使用此共享库 重新运行包含TestServer()类的测试。你会注意到它

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

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

  • 请参阅以下链接以创建集成测试

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

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

    这是一行代码,以防您无法阅读上面的图片

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

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

    
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .AddApplicationPart(typeof(ServiceHookController).Assembly);
    }
    
    如果按照以下步骤操作,将加载来自单独程序集的控制器


    在我的例子中,添加解决了这个问题,我不再需要调用
    AddApplicationPart

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

    在我的例子中,我更改了第一行XML


    信用证收件人:

    不确定,但听起来不对。。您确定您在测试中没有一些逻辑,这些逻辑可能正在对程序集进行一些反射。@loneshark99,我现在找到了一个解决方法。有关详细信息,请参见下面的屏幕截图。同样,这看起来像TestServer的一个bug,这是我在评论中说的:)你很接近,我会告诉你的。:)关于查找具有控制器的程序集(可能是控制器工厂)的逻辑似乎封装在Microsoft.AspNetCore.TestHost程序集中。顺便说一句,你是在为这个项目做贡献还是只是为了学习我的一天。您还应该提到Github上的相关问题:您救了我的命。请注意,如果您正在容器中向AddControllerAsservices注册控制器,则应首先调用AddApplicationPart。您不必使用Assembly.Load,下一个代码段也可以工作。ServiceHookController来自要测试的程序集。services.AddMvc().AddApplicationPart(类型为(ServiceHookController.Assembly));我更喜欢这个。非常感谢。但是如果我在我的测试项目中更改了那一行,我会得到一个“程序不包含适合入口点的静态‘Main’方法”。我想我是在我的*.Web.Tests项目中这样做的,但我不记得了。这类问题似乎需要清洁解决方案,然后是重建解决方案。这对我来说很有效。新的3.1应用程序,不是迁移。是的,这个更改对我不起作用。OMFG。我连续两天都在寻找你的答案。非常感谢你!