代码之家  ›  专栏  ›  技术社区  ›  kovac

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

  •  0
  • kovac  · 技术社区  · 5 年前

    我有一个方法,可以使用Flurl对两个不同的URL进行两次HTTP调用。我需要对这个方法进行单元测试,我希望Flurl用两种不同的响应进行响应。我该怎么设置呢?

    我的测试课是这样的:

    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.
            }
        }
    }
    

    我的测试课程如下:

    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(...);
    
    0 回复  |  直到 5 年前
        1
  •  3
  •   Todd Menier    5 年前

    简而言之,答案是否定的,你现在不能通过URL来配置不同的行为,但它将出现在3.0版本中。我会在发布时更新它(如果我忘记了,希望其他人也会更新:)。

    不过,在这种特殊情况下,假设您的SUT代码至少在某种程度上类似于您目标的真实代码,那么看起来url1总是在url2之前被调用,因此如果您只是以相同的顺序对响应进行排队,Flurl将保证它们以相同的顺序返回。

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

    当然,SUT可能不会以这样的确定顺序调用对象,在这种情况下,很遗憾,您必须等待3.0。