C# 集成测试状态 "not run" 授权 returns 禁止时

C# integration test status "not run" when authorization returns forbidden

我目前正在为 ASP.NET 核心项目编写 C# 集成测试。我想进行验证端点安全性的测试——具体来说,端点向授权用户授予访问权限,但拒绝未授权用户访问。 我对第一个用例进行了工作测试,但我 运行 在第二个用例中遇到了一些奇怪的行为。

这是集成测试:

        [Test]
    public async Task GetDrives_ShouldReturnForbidden_WhenCalledByExternalUser()
    {
        // Arrange
        TestClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Test", "a@b.c");
        UriBuilder builder = new("https://localhost/api/Drive");
        builder.Query = "Id=49";
        // Act
        HttpResponseMessage response = await TestClient.GetAsync(builder.Uri);
        var responseContent = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseContent);
        // Assert
        response.StatusCode.ShouldBe(HttpStatusCode.Forbidden);
        responseContent.ShouldBeEmpty();
    }

现在,测试完全按照其名称进行 - 端点 returns 被禁止。行为变得奇怪的地方是,当我 运行 这个测试时,我希望它通过,但相反,它会导致“不是 运行” 状态。调试测试时,我可以看到它一直 运行,所以测试确实 运行,但最终状态并未反映出这一点。

经过大量谷歌搜索后,我没有找到任何可以解释此行为的内容。我怀疑这部分是因为请求是由 [Authorize] 属性处理的,所以它永远不会命中测试框架知道的端点代码,因此认为测试“不是 运行”。有没有人以前遇到过这个并且可以确认这是正在发生的事情?有谁知道如何让这个测试产生 pass/fail 结果?

解决一个类似的测试问题(一个没有被持续重新运行的测试)帮助我找到了答案。

这两个问题的原因是 console.writeline 抛出异常,但 IDE 没有主动标记它,只是记录它,因此在某种程度上掩盖了问题。

当端点调用被禁止时,writeline 值参数只有空格,导致 System.ArgumentException:参数不能为 null 或为空。对代码稍作调整即可防止异常发生并提供正确的通过结果。

这是之前的代码:

这是之后的代码:

这里的要点 - 如果 运行ning 在 visual studio 中进行测试,并且您会遇到奇怪的行为,例如测试 运行 但不提供结果,或者测试运行 一次,但不要重新 运行,检查测试 运行ner 输出 - 那里可能隐藏着错误!