Всем привет,
Добавил проект интеграционных тестов для своего апи по инструкции:
https://docs.microsoft.com/en-us/aspnet/core/test/...
Почти в каждом методе в подготовке (Arrange) необходимо сделать две вещи: занести исходные данные для теста в базу и отправить запрос на авторизацию. Это занимает прям пол страницы и выглядит отвратительно. Подскажите, как можно облагородить этот код? Может быть вынести подготовку в какие-то билдеры, но я не понимаю, как это можно красиво написать. Вот пример тестового метода, один пользователь с нужными правами (суперадмин) создается в базе ранее и инфа о нём хранится в статик файле
public class EpicTests : IClassFixture<ApiApplicationFactory<Program>>
{
private readonly ApiApplicationFactory<Program> _factory;
public Epic(ApiApplicationFactory<Program> factory)
{
_factory = factory;
}
[Fact]
public async Task Details()
{
// Arrange
var epic = new Atheneum.Entity.Epic
{
Id = 42,
Assignee = ArrangeUsers.SuperAdmin.Id,
Reporter = ArrangeUsers.SuperAdmin.Id,
Priority = IssuePriorityEnum.high,
Name = "Тестовый эпик",
Description = "Ребята решили протестировать санни дей на эпик",
DueDate = new DateTime(2007, 1, 1)
};
var client = _factory.WithWebHostBuilder(builder =>
{
builder.ConfigureServices(services =>
{
var sp = services.BuildServiceProvider();
using var scope = sp.CreateScope();
var scopedServices = scope.ServiceProvider;
var db = scopedServices.GetRequiredService<ApplicationContext>();
db.Epic.Add(epic);
db.SaveChanges();
});
}).CreateClient();
var usr = new LoginDto()
{
Login = ArrangeUsers.SuperAdmin.UserName,
Password = ArrangeUsers.SuperAdminPassword
};
await client.PostAsJsonAsync("/api/Auth/Login", usr);
// Act
var response = await client.GetAsync("/api/Epic/Details?id=42");
// Assert
await response.ShouldBeSuccessful();
var result = await response.Content.ReadFromJsonAsync<EpicDto>();
Assert.True(result.Id == epic.Id, "Id");
Assert.True(result.Assignee == epic.Assignee, "Assignee");
}
}