Устройство xUnit с IAsyncLifetime не работает должным образомC#

Место общения программистов C#
Ответить
Anonymous
 Устройство xUnit с IAsyncLifetime не работает должным образом

Сообщение Anonymous »

Я создаю интеграционные тесты для проекта .net с помощью TestContainers и xUnit.
Мне нужно добавить пользователя в каждый тест, чтобы я мог выполнить авторизованный запрос. Для этого я создаю общедоступный класс BaseRuntimeTest: IClassFixture, IDisposable, IAsyncLifetime .
Затем BaseRuntimeTest реализует:

Код: Выделить всё

    public async Task InitializeAsync()
{
await AddAdminUserAsync(Factory.CreateClient());
}

public async Task DisposeAsync()
{
await DeleteAdminUserAsync(Factory.CreateClient());
}
Этот класс BaseRuntimeTest затем расширяется моим классом интеграционного тестирования (на данный момент у меня есть только один тестовый класс, поэтому я считаю, что поведение xUnit по умолчанию должно быть последовательным, а не параллельным). Ниже вы можете увидеть два имеющихся у меня теста:

Код: Выделить всё

public class AccountTests(RuntimeTestWebAppFactory factory) : BaseRuntimeTest(factory)
{
private readonly AccountHelper _accountHelper = new();

private readonly Fixture _fixture = new();

[Fact]
public async Task Accounts_GetAll_WhenMultipleAccountsExist_ReturnsAll_200()
{
// Arrange
var accounts = new List
{
_accountHelper.CreateAccount(_fixture.Create()),
_accountHelper.CreateAccount(_fixture.Create())
};
await ArrangeAccountRegistryAsync(accounts);

// Act
var response = await AdminAuthorizedClientHttp.GetAsync($"{Constants.Application.GetRuntimeApiUrl()}/accounts");

// Assert
var jArray = JArray.Parse(await response.Content.ReadAsStringAsync());

jArray.Should().HaveCount(accounts.Count);
((int)response.StatusCode).Should().Be(200);
}

[Fact]
public async Task Accounts_GetAll_WhenNoAccountExist_ReturnsEmpty_200()
{
// Arrange
await ArrangeAccountRegistryAsync([]);

// Act
var response = await AdminAuthorizedClientHttp.GetAsync($"{Constants.Application.GetRuntimeApiUrl()}/accounts");

// Assert
var jArray = JArray.Parse(await response.Content.ReadAsStringAsync());

jArray.Should().BeEmpty();
((int)response.StatusCode).Should().Be(200);
}
Если я запускаю все тесты, только один проходит успешно, а остальные терпят неудачу из-за того, что пользователь уже существует в базе данных, это означает, что DisposeAsync не удалил пользователя вовремя.Если я запускаю все тесты в режиме отладки, я вижу, что порядок выполнения соответствует задуманному, и кажется, что все они проходят успешно, поскольку я останавливаюсь на точках останова, давая больше времени для выполнения...
Похоже, DisposeAsync все еще выполняется, пока начинается выполнение следующего теста. Я что-то упустил?

Подробнее здесь: https://stackoverflow.com/questions/788 ... -intendend
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»