Flurl 测试:如何根据条件设置响应?

Flurl Testing: How to setup response based on conditions?

我有一个方法可以使用 Flurl 对两个不同的 url 进行两次 HTTP 调用。我需要对该方法进行单元测试,我希望 Flurl 在其中以两种不同的响应进行响应。我该如何设置?

我的测试 class 是这样的:

public class SUT
{
    public async Task Mut(object obj)
    {
        var x = await url1.PostJsonAsync(obj).ReceiveJson();

        if ((bool)x.property = true)
        {
            var y = await url2.GetJsonAsync();
            // Process y.
        }
    }
}

我有一个测试 class 如下:

public class TestSut : Disposable
{
    private readonly HttpTest httpTest;

    public TestSut()
    {
        httpTest = new HttpTest();
    }

    [Fact]
    public async Task TestMut()
    {
        // call Mut...
    }

    public void Dispose()
    {
       httpTest?.Dispose();
    }
}

我想要的是:

httpTest.ForUrl(url1).ResponsdWithJson(...);
httpTest.ForUrl(url2).ResponsdWithJson(...);

简短的回答是否定的,您今天无法通过 URL 配置不同的行为,但它会在 3.0 中推出。当它发布时我会更新它(或者如果我忘记了,希望其他人会更新 :)。

虽然在这种特殊情况下,假设您的 SUT 代码至少有点类似于您要定位的真实代码,看起来 url1 将始终在 url2 之前被调用,因此如果您只是以相同的顺序对响应进行排队, Flurl 将保证它们以相同的顺序返回。

httpTest
    .ResponsdWithJson(/* fake response for url1 */)
    .ResponsdWithJson(/* fake response for url2 */);

当然,SUT 实际上可能不会像那样以确定的顺序调用事物,在这种情况下,不幸的是,您将不得不等待 3.0。