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

Difference between EnsureSuccessStatusCode and Assert.Equal(HttpStatusCode.OK, response.StatusCode) in XUnit ASP.Net Core WebAPI Tests

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

HttpResponseMessage.EnsureSuccessStatusCodeimplemented like this:

public HttpResponseMessage EnsureSuccessStatusCode()
{
    if (!IsSuccessStatusCode)
    {
        throw new HttpRequestException(…, inner: null, _statusCode);
    }
 
    return this;
}

所以它只检查 IsSuccessStatusCode 的值,即 implemented like this:

public bool IsSuccessStatusCode
{
    get { return ((int)_statusCode >= 200) && ((int)_statusCode <= 299); }
}

所以一个状态码被认为是成功的,如果它在 [200, 299] 范围内。这符合 HTTP 状态代码的定义。

如果状态码值不是成功码,那么EnsureSuccessStatusCode方法会抛出异常。所以在请求失败的情况下,这是一种快速停止执行的方法。

断言与 HttpStatusCode.OK 相等检查状态代码是否 恰好 200。这也意味着其他成功的代码将被拒绝。这是否合适取决于您正在测试的API。许多 RESTful API 经常会 return 不同的成功状态代码,具体取决于发生的事情。例如,API 可能 return “201 Created” 表示已创建资源。

如果测试想要明确确保响应具有状态代码“200 OK”,则不需要调用 EnsureSuccessStatusCode。否则,如果您想接受任何成功的状态代码,只需调用 EnsureSuccessStatusCode 就足以进行测试,因为抛出的异常通常会使测试失败。