如何使用TestServer和Antiforgery修复POST集成测试中的500 Internal Server Error? ASP.NET核心

时间:2019-01-23 00:12:43

标签: c# post asp.net-core integration-testing internal-server-error

我有一个同时使用MVC和API控制器的有效的ASP.NET Core 2.2实现,并且我将一个集成测试项目组合在一起,以涵盖已经手动测试的所有内容-主要是基本内容。除了使用PostAsync来发布数据的测试之外,其他所有功能都可以正常工作。这些测试始终会从客户端获得500内部服务器错误作为响应,而我一生都无法弄清原因。哎呀!

TestServer设置是一种非常标准的方法,我在许多不同的博客和文章中都看到过。 TestStartup类扩展了标准的Startup,并覆盖了配置以将内存数据库与种子数据一起使用。然后,我的测试夹具库使用TestStartup创建服务器和客户端,并具有一个我知道可以正常工作的方法,以提取防伪令牌并将其添加到表单和标头中。验证CRUD其他所有方面的所有其他测试均正常运行,证明可以通过MVC和API调用来检索种子数据。

最终因500 Internal Server Error(内部服务器错误)而失败的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路由来验证是否创建了一个新的简单对象,类型为Label,该对象遵循标准路径格式,已被脚手架安装。该测试会将其放入控制器及其存储库中,但响应将是500 Internal Server Error。

我会错过启动中的重要内容吗?有什么想法可以找到有关此故障的更多详细信息?提前致谢!如果有帮助,我可以发布更多代码或详细信息。

1 个答案:

答案 0 :(得分:1)

尝试添加跟踪日志记录...跟踪日志记录将在.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>();
    ...

示例跟踪日志:

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

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