如何使用flurl声明请求的响应代码

时间:2019-02-07 18:22:59

标签: flurl

我正尝试为我的请求声明响应代码,但是我很难弄清楚,请您帮我一下。这是我的实现和定义。

myTests.cs

~/.yarn/bin

==>如何在上述语句之后立即在此处设置断言以验证响应状态?

helpers.cs

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

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

“ AccessToken”的数据模型位于Dto.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);
    }
}

1 个答案:

答案 0 :(得分:0)

如果您正在寻找Flurl's testing features来帮助解决此问题,恐怕将无法正常工作。这些功能是专门设计用于根据您在测试中设置的 fake 响应来测试客户端代码的行为的。看来您想通过 real 调用声明状态代码。

我能想到的最好的方法是在.ReceiveJson<T>()中放下SendRequestAsync行,并更改方法签名以返回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>();