我正在为ASP.NET Core 3.0中的Api控制器编写集成测试。该测试适用于以实体列表作为响应的路由。当我尝试对响应内容进行断言时,DateTime属性的序列化方式存在差异。
我尝试在测试中使用自定义JsonConverter:
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader,Type typeToConvert,JsonSerializerOptions options)
{
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer,DateTime value,JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-ddThh:mm:ss.ffffff"));
}
}
问题在于此转换器不会截断尾随零,而实际响应会截断。因此,测试失败的几率为十分之一。
这是测试失败:
[Fact]
public async Task GetUsers()
{
using var clientFactory = new ApplicationFactory<Startup>();
using var client = clientFactory.Createclient();
using var context = clientFactory.CreateContext();
var user1 = context.Users.Add(new User()).Entity;
var user2 = context.Users.Add(new User()).Entity;
context.SaveChanges();
var users = new List<User> { user1,user2 };
var jsonSerializerOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
var serializedUsers = JsonSerializer.Serialize(users,jsonSerializerOptions);
var response = await client.Getasync("/users");
var responseBody = await response.Content.ReadAsStringAsync();
Assert.Equal(serializedUsers,responseBody);
Assert.Equal(HttpStatusCode.OK,response.StatusCode);
}
我希望测试能够通过,但是却出现此错误:
Error Message:
Assert.Equal() Failure
↓ (pos 85)
Expected: ···1-05T22:14:13.242771-03:00","updatedAt"···
actual: ···1-05T22:14:13.242771","updatedAt"···
我没有在控制器的实际实现中配置任何序列化选项。
如何正确实施此集成测试?是否有一种简单的方法可以使用真实控制器的相同选项在测试中序列化列表?