前言
当我们为 Web API
编写测试用例时,代码基本是这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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
将上面的测试用例改用 FluentAssertions.Web
,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[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
测试,还可以从断言的失败原因中提取足够的信息,从而减少调试时间。