AR9*_*AR9 4 c# post integration-testing internal-server-error asp.net-core
我已经有了一个可以使用 MVC 和 API 控制器的 ASP.NET Core 2.2 实现,并且我正在整理一个集成测试项目来涵盖已经手动测试过的所有内容 - 主要是基本的 CRUD。除了使用 PostAsync 来 POST 数据的测试之外,一切正常。这些测试总是收到 500 内部服务器错误作为客户端的响应,但我一辈子都无法弄清楚原因。哎呀!
TestServer 设置是一种非常标准的方法,我在许多不同的博客和文章中都看到过。TestStartup 类扩展了标准 Startup,并覆盖配置以使用带有种子数据的内存数据库。然后,我的测试夹具基础使用 TestStartup 创建服务器和客户端,并有一个我知道效果很好的方法来提取防伪令牌并将其添加到表单和标头中。验证 CRUD 所有其他方面的所有其他测试都正常工作,证明可以通过 MVC 和 API 调用检索种子数据。
最终因 500 内部服务器错误而失败的 POST 调用确实会进入控制器和后续存储库,这很好。有了所有这些方面,我还没有能够看到 500 的来源。
[Fact]
public async void CreatePost_ShouldReturnViewWithNewlyCreatedLabelData()
{
// Arrange
var formData = await EnsureAntiForgeryTokenOnForm(new Dictionary<string, string>()
{
{ "Name", TestDataGraph.Labels.LabelNew.Name },
{ "WebsiteUrl", TestDataGraph.Labels.LabelNew.WebsiteUrl }
});
// Act
var response = await Client.PostAsync("/labels/create", new FormUrlEncodedContent(formData));
// Assert
Assert.Equal(HttpStatusCode.Found, response.StatusCode);
Assert.Equal("/Labels", response.Headers.Location.ToString());
}
Run Code Online (Sandbox Code Playgroud)
这是 Xunit 中的一个简单示例测试,尝试通过 MVC 路由验证新的简单对象(类型 Label)的创建,该路由遵循标准路径格式并已搭建。此测试将使其进入控制器及其存储库,但响应将是 500 内部服务器错误。
我是否错过了启动中的一些重要内容?有什么想法可以找到有关此失败的更多详细信息吗?提前致谢!如果有帮助的话,我可以发布更多代码或详细信息。
尝试添加跟踪日志记录...跟踪日志记录将显示 .Net Core 框架中的活动。
...
public static ILogger<ConsoleLoggerProvider> AppLogger = null;
public static ILoggerFactory loggerFactory = null;
//
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(builder => builder
.AddConsole()
.AddFilter(level => level >= LogLevel.Trace)
);
loggerFactory = services.BuildServiceProvider().GetService<ILoggerFactory>();
AppLogger = loggerFactory.CreateLogger<ConsoleLoggerProvider>();
...
Run Code Online (Sandbox Code Playgroud)
跟踪日志示例:
trce: Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler[7]
Could not find a file for view at path '/Views/Home/_Layout.cshtml'.
Run Code Online (Sandbox Code Playgroud)
解决问题后,将 LogLevel 更改为更合适的值。