XUnit ASP.Net Core WebAPI 测试中 EnsureSuccessStatusCode 和 Assert.Equal(HttpStatusCode.OK, response.StatusCode) 之间的区别

Loc*_*bug 2 xunit asp.net-core

我在一本书(ISBN 1838550313、9781838550318 S.315)中读到,他们在一个验证方法中使用 EnsureSuccessStatusCode() 和 Assert.Equal(HttpStatusCode.OK, ..) 检查 WEB-API 请求。但是第二个 Assert 调用不需要检查 HTTP-Status 是否为 200 吗?有什么区别以及最佳实践是什么?

在此输入图像描述

pok*_*oke 5

HttpResponseMessage.EnsureSuccessStatusCode这样实现的

\n
public HttpResponseMessage EnsureSuccessStatusCode()\n{\n    if (!IsSuccessStatusCode)\n    {\n        throw new HttpRequestException(\xe2\x80\xa6, inner: null, _statusCode);\n    }\n \n    return this;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

IsSuccessStatusCode所以它只是检查其实现的值,如下所示

\n
public bool IsSuccessStatusCode\n{\n    get { return ((int)_statusCode >= 200) && ((int)_statusCode <= 299); }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

因此,如果状态代码在 [200, 299] 范围内,则认为它是成功的。这与 HTTP 状态代码的定义相匹配。

\n

如果状态代码值不是成功代码,则该EnsureSuccessStatusCode方法将引发异常。因此,这是在请求失败的情况下停止执行的快速方法。

\n

HttpStatusCode.OK通过检查状态代码是否恰好为200来断言相等。这也意味着其他成功的代码将被拒绝。这是否合适取决于您正在测试的 API。许多 RESTful API 通常会根据发生的情况返回不同的成功状态代码。例如,API 可能返回 \xe2\x80\x9c201 Created\xe2\x80\x9d 来表示资源已创建。

\n

如果测试想要显式确保响应的状态码为 \xe2\x80\x9c200 OK\xe2\x80\x9d,则EnsureSuccessStatusCode不需要调用。否则,如果您想接受任何成功的状态代码,只需调用EnsureSuccessStatusCode就足以进行测试,因为抛出的异常通常会使测试失败。

\n