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 输出 - 那里可能隐藏着错误!
我目前正在为 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 输出 - 那里可能隐藏着错误!