如何编写干净流畅的Web API测试

前言

当我们为Web API编写测试用例时,代码基本是这样的:

public class UnitTest1
{
    private readonly TestServer _server;
    private readonly HttpClient _client;

    public UnitTest1()
    {
        // Arrange
        _server = new TestServer(new WebHostBuilder()
            .UseStartup<Startup>());
        _client = _server.CreateClient();
    }
    [Fact]
    public async Task Test1()
    {
        // Act
        var response = await _client.GetAsync("/WeatherForecast");
        response.EnsureSuccessStatusCode();
        var responseString = await response.Content.ReadAsStringAsync();
        var actual = Newtonsoft.Json.JsonConvert.DeserializeObject<IEnumerable<WeatherForecast>>(responseString);
        // Assert
        Assert.Equal(5, actual.Count());
    }
}

我们需要获得HttpResponseMessage response,检查它的StatusCode,如果要对响应内容进行断言,还需要对其反序列化。

这样的问题是,测试用例中的大量代码都是和测试本身无关的,而且用例一多,还会形成大量重复性的代码。

这时,可以试试FluentAssertions.Web,它为HttpResponseMessage提供了大量扩展方法,用于单元测试中的断言。

Demo

1.断言

将上面的测试用例改用FluentAssertions.Web,代码如下:

[Fact]
public async Task Test1()
{
    // Act
    var response = await _client.GetAsync("/WeatherForecast");
    // Assert
    response.Should().Be200Ok()
        .And
        .Satisfy<IEnumerable<WeatherForecast>>(model =>
        {
            model.Should().HaveCount(5);
        });
}

现在,断言是不是看起来更自然流畅!

2.失败原因

我们修改代码,仅返回1条数据,使得测试失败:

图片

可以看到,失败原因返回了详细的诊断信息,我们无需再像以前那样,还需要调试代码,检测错误原因了。

结论

使用FluentAssertions.Web,不仅可以编写干净流畅的Web API测试,还可以从断言的失败原因中提取足够的信息,从而减少调试时间。

Guess you like

Origin blog.csdn.net/mzl87/article/details/121156098