如何使用 flurl 断言请求的响应代码

How to Assert for Response Code for request using flurl

我正试图为我的请求对响应代码进行断言,但我很难弄清楚,你能帮我解决这个问题吗?这是我的实现和定义。

myTests.cs

var accessToken = await helper.SendRequestAsync<AccessToken>(baseUrl, body);

==> 如何在上面的语句之后立即在这里设置断言来验证响应状态?

helpers.cs

public static async Task<T> SendRequestAsync<T>(string baseUrl, Dictionary<string, string> body)
{
    using (var flurl_client = new FlurlClient(baseurl))
    {
        try
        {
            var response = await flurl_client
                            .Request()
                            .PostUrlEncodedAsync(body)
                            .ReceiveJson<T>();
            return response;
        }
        catch (Exception ex)
        {
            Assert.Fail(ex.Message);
        }
        return default(T);
    }
}

============================================= =========

"AccessToken" 的数据模型在 Dto.cs

public class AccessToken
{
    public string token_type { get; set; }
    public string expires_in { get; set; }
    public string ext_expires_in { get; set; }
    public string expires_on { get; set; }
    public string not_before { get; set; }
    public string resource { get; set; }
    public string access_token { get; set; }
    public string refresh_token { get; set; }
    public object Status_Code { get; set; }
}

如果您正在寻找 Flurl's testing features 来帮助解决这个问题,恐怕它不会起作用。这些功能专门用于根据您在测试中设置的 fake 响应来测试客户端代码的行为。看起来您想断言来自 real 调用的状态代码。

我能想到的最好的方法是删除 SendRequestAsync 中的 .ReceiveJson<T>() 行并将方法签名更改为 return Task<HttpResponseMessage>:

using System.Net.Http;

public static async Task<HttpResponseMessage> SendRequestAsync(string baseUrl, Dictionary<string, string> body)
{
    using (var flurl_client = new FlurlClient(baseurl))
    {
        try
        {
            var response = await flurl_client
                .Request()
                .PostUrlEncodedAsync(body); // this returns Task<HttpResponseMessage>

            return response;
        }
        catch (Exception ex)
        {
            Assert.Fail(ex.Message);
        }
        return null;
    }
}

那么你的测试可以这样做:

var resp = await Helper.SendRequestAsync(...);
Assert.AreEqual(HttpStatusCode.OK, resp.StatusCode);

任何需要反序列化响应主体的东西都可以这样做:

var token = await Helper.SendRequestAsync(...).ReceiveJson<AccessToken>();