前言
当我们为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(){// Actvar response = await _client.GetAsync("/WeatherForecast");response.EnsureSuccessStatusCode();var responseString = await response.Content.ReadAsStringAsync();var actual = Newtonsoft.Json.JsonConvert.DeserializeObject<IEnumerable<WeatherForecast>>(responseString);// AssertAssert.Equal(5, actual.Count());}
}
我们需要获得HttpResponseMessage response,检查它的StatusCode,如果要对响应内容进行断言,还需要对其反序列化。
这样的问题是,测试用例中的大量代码都是和测试本身无关的,而且用例一多,还会形成大量重复性的代码。
这时,可以试试FluentAssertions.Web,它为HttpResponseMessage提供了大量扩展方法,用于单元测试中的断言。
Demo
1.断言
将上面的测试用例改用FluentAssertions.Web,代码如下:
[Fact]
public async Task Test1()
{// Actvar response = await _client.GetAsync("/WeatherForecast");// Assertresponse.Should().Be200Ok().And.Satisfy<IEnumerable<WeatherForecast>>(model =>{model.Should().HaveCount(5);});
}
现在,断言是不是看起来更自然流畅!
2.失败原因
我们修改代码,仅返回1条数据,使得测试失败:
可以看到,失败原因返回了详细的诊断信息,我们无需再像以前那样,还需要调试代码,检测错误原因了。
结论
使用FluentAssertions.Web,不仅可以编写干净流畅的Web API测试,还可以从断言的失败原因中提取足够的信息,从而减少调试时间。