Jeer
@Jeer
уверенный пользователь

Как сделать интеграционные тесты изящными?

Всем привет,
Добавил проект интеграционных тестов для своего апи по инструкции:
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");
    }
}
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега C#
Токсичный шарпист

Почти в каждом методе в подготовке (Arrange) необходимо сделать две вещи: занести исходные данные для теста в базу и отправить запрос на авторизацию.

В xunit для такого используется конструктор.
А если это асинхронные вызовы, то интерфейс IAsyncLifetime.
Туда выносится то, что прям никак не отличается от теста к тесту.
А для чистки после выполнения тестов - Idisposable.Dispose
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы