从 Body 迁移 .NET Core 2.2 到 3.1 集成测试始终为空

Posted

技术标签:

【中文标题】从 Body 迁移 .NET Core 2.2 到 3.1 集成测试始终为空【英文标题】:Migration .NET Core 2.2 to 3.1 Integration test from Body always null 【发布时间】:2020-06-15 14:57:08 【问题描述】:

我正在尝试将我的 API 和集成测试从 .NET Core 2.2 迁移到 3.1。 考虑到 API prj 的所有工作正常,迁移和违反 Microsoft 更改调整后。 我用邮递员试过了。

此时我尝试迁移我的集成测试项目,但迁移后所有带有 [FromBody] 参数的 http 调用都会出错,因为 fromBody 参数始终为空。

这里有更多信息:

.NET Core 2.2 代码:

        IWebHostBuilder webHostBuilder = Program.CreateBuilder()
            .UseEnvironment(TestEnvironmentName.Get(inMemory: true))
            .ConfigureEntityFrameworkForTesting(fixture);
        _server = new TestServer(webHostBuilder);

        var client = _server.CreateClient();
        _client = new FluentClient("http://a", client);
        _client.SetHttpErrorAsException(false);

        _testHost = TestHostBuilder.Create()
            .ConfigureServices(services => services.AddTestServiceBus(_server.Host.Services))
            .Build();
        _testHost.Run();

.NET Core 3.1 代码:

               var hostBuilder = new HostBuilder()
               .ConfigureWebHostDefaults(webHost =>
               
                   // Add TestServer
                   webHost.UseTestServer();
                   webHost.UseEnvironment(HostTestEnvironmentName.Get(inMemory: true))
                        .ConfigureEntityFrameworkForTesting(fixture)
                        .UseStartup<Startup>();
               );

                var host = hostBuilder.Start();
                var client = host.GetTestClient();

                _client = new FluentClient("http://a", client);

                _server = host.GetTestServer();

我已经:

检查测试使用的 https 客户端是否包含“ContentType”作为 json。 尝试移除 fluent 客户端并使用“System.Net.Http.HttpClient”。

现在我怀疑我在调用 host.GetTestServer() 时发现的这条消息。但这不是一个真正的错误,它不会破坏我的运行时,我只是通过快速观察 _server 变量来看到它。

错误消息:“未使用 IWebHostBuilder 调用 TestServer 构造函数,因此 IWebHost 不可用。” QuickWatchImage

我不太确定这是否与我的问题有关,我没有想法。

【问题讨论】:

您找到解决方案了吗? 【参考方案1】:

在没有任何其他答案的情况下,我会尝试一下,你决定它是否适合:

https://developpaper.com/asp-net-core-uses-xunit-for-host-level-network-integration-testing/

在上面的链接中,我发现了相同的错误消息(“未使用 IWebHostBuilder 调用 TestServer 构造函数,因此 IWebHost 不可用。”)。

我必须做的是更改为 2.x IWebHost 更新 IHost(这是我们应该为 3.0+ 做的)的代码。

全面披露:我对集成测试完全陌生,今天正在构建我的第一个测试。但是这段代码成功了:

// no dice -- "The TestServer constructor was not called with a IWebHostBuilder...
// var hostBuilder = Your.App.Program.CreateHostBuilder(new string[0], config);
// using var system = new SystemUnderTest(hostBuilder);

// this seems to be the way forward
var webHostBuilder = new WebHostBuilder()
    .UseStartup<<Your.App.Startup>()
    .UseConfiguration(config);
using var system = new SystemUnderTest(webHostBuilder);

无论如何,这就是我现在所处的位置。看来我可能已经度过了最糟糕的时期。

【讨论】:

感谢您的回复,但是 WebHostBuilder 将被弃用。 docs.microsoft.com/en-us/aspnet/core/migration/… 现在我们在 5.x / 6.x LOL... 自从我上次写在这里以来,我的设置已经有了很大的不同。希望你的也有,并且这个问题不再相关...... 嗯,我们只是开始从 2.2 迁移到 3.0,所以仍然有点相关 :) 最后,我们最终使用了 WebApplicationFactory 并确保我们的项目文件具有

以上是关于从 Body 迁移 .NET Core 2.2 到 3.1 集成测试始终为空的主要内容,如果未能解决你的问题,请参考以下文章

从 2.2 .Net core 迁移到 3.0 Cors 错误

从 .NET Core 2.2 迁移到 3.1 后,EF Core 随机抓取 API 请求上的用户表

从 2.2 迁移到 3.1 的 ASP.Net Core 解决方案在发布时不会运行

如何将 .NET Core 2.2 Web API 迁移到 .NET Core 3.0?

迁移到 .NET Core 3.1 - 缺少 Newtonsoft

将 Asp.Net Core 2.2 App 迁移到 3.1 时的整数序列化 [关闭]