【问题标题】:Difference between EnsureSuccessStatusCode and Assert.Equal(HttpStatusCode.OK, response.StatusCode) in XUnit ASP.Net Core WebAPI TestsXUnit ASP.Net Core WebAPI 测试中 EnsureSuccessStatusCode 和 Assert.Equal(HttpStatusCode.OK, response.StatusCode) 之间的区别
【发布时间】:2020-07-04 20:47:13
【问题描述】:

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

【问题讨论】:

  • 据我所知,如果调用失败, EnsureSuccessStatusCode 会抛出异常。所以在我看来, HttpStatusCode.Ok 上的 Assert 是多余的,因为它必须是真的,否则你的测试会抛出异常。但在这件事上,不要使用 async void,使用 async Task。如果您在代码中执行 async void 并引发异常,则您的应用程序已死并且无法恢复,除非您重新启动应用程序。

标签: asp.net-core xunit


【解决方案1】:

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 通常会根据发生的情况返回不同的成功状态代码。例如,API 可能会返回“201 Created”来表示资源已创建。

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

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2017-10-23
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2017-06-26
    • 1970-01-01
    相关资源
    最近更新 更多