从 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?