Я пишу интеграционный тест для контроллера Api в ASP.NET Core 3.0. Тест для маршрута, который отвечает со списком объектов. Когда я пытаюсь сделать утверждения для содержимого ответа, существует расхождение в способе сериализации свойств 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"));
}
}
Проблема в том, что этот преобразователь не усекает конечные нули, в то время как фактический ответ делает. Итак, у теста есть шанс 1 к 10. Неудачный.
Это неудачный тест:
[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"···
Я не настраивал никакие параметры сериализации в реальной реализации контроллера.
Как правильно реализовать этот интеграционный тест? Есть ли простой способ сериализации списка в тесте, используя те же параметры реального контроллера?