如何使用 TestServer 和 Antiforgery 修复 POST 集成测试的 500 内部服务器错误? ASP.NET核心

How to fix 500 Internal Server Error for POST integration tests using TestServer and Antiforgery? ASP.NET Core

我有一个可用的 ASP.NET Core 2.2 实现,它同时使用了 MVC 和 API 控制器,我正在整合一个集成测试项目以涵盖已经手动测试过的所有内容- 基本的垃圾,主要是。除了对 POST 数据使用 PostAsync 的测试外,一切正常。这些测试总是收到 500 Internal Server Error 作为客户端的响应,我终究无法弄清楚原因。哎呀!

TestServer 设置是一种非常标准的方法,我在许多不同的博客和文章中都看到过。 TestStartup class 扩展标准 Startup,并覆盖配置以使用 in-memory 数据库和种子数据。然后,我的测试夹具基础使用 TestStartup 创建服务器和客户端,并且有一个方法,我知道它工作正常,用于提取防伪标记并将其添加到表单和 headers。验证 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());
    }

这是 Xunit 中的一个简单示例测试,它试图验证通过 MVC 路由创建一个新的简单 object 类型标签,该路由遵循标准路径格式,已搭建好脚手架。此测试将进入控制器及其存储库,但响应将是 500 内部服务器错误。

我会不会错过了 Startup 中的重要内容?找到有关此失败的更多详细信息的任何想法?提前致谢!如果有帮助,我可以 post 更多代码或详细信息。

尝试添加跟踪日志...跟踪日志将在 .Net Core 框架中显示 activity。

...
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>();
    ...

示例跟踪日志:

trce: Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler[7]
    Could not find a file for view at path '/Views/Home/_Layout.cshtml'.

解决问题后,将 LogLevel 更改为更合适的值。