前言
当我们为Web API编写测试用例时,代码基本是这样的:
public class UnitTest1
{
private readonly TestServer _server;
private readonly HttpClient _client;
public UnitTest1()
{
// Arrange
_server = new TestServer(new WebHostBuilder()
.UseStartup());
_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(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(model =>
{
model.Should().HaveCount(5);
});
}
现在,断言是不是看起来更自然流畅!
2.失败原因我们修改代码,仅返回1条数据,使得测试失败:
可以看到,失败原因返回了详细的诊断信息,我们无需再像以前那样,还需要调试代码,检测错误原因了。
结论使用FluentAssertions.Web,不仅可以编写干净流畅的Web API测试,还可以从断言的失败原因中提取足够的信息,从而减少调试时间。