В настоящее время я работаю над комплексным тестированием системы, которая включает обработку событий с использованием MassTransit. Моя стратегия тестирования включает метод PublishEvents(), который взаимодействует со службой исходящих сообщений и публикует все ожидающие события в MassTransit, гарантируя, что для каждого из них установлен messageId. Я также разработал метод ProcessAllEvents(), предназначенный для публикации и последующего подтверждения обработки всех событий.
Этот подход хорошо работает для одного теста. Однако когда я последовательно выполняю несколько тестов, каждый из которых вызывает ProcessAllEvents(), я сталкиваюсь с проблемой: хотя первый тест завершается успешно, последующие тесты имеют тенденцию завершаться неудачно. Похоже, проблема в том, что в этих более поздних тестах события не обрабатываются в течение ожидаемого периода времени, что приводит к сбою.
Вот упрощенная версия того, что делает ProcessAllEvents():
Вот упрощенная версия того, что делает ProcessAllEvents():
p>
- Запускает новый экземпляр тестового оборудования MassTransit.
- Вызывает PublishEvents() для публикации всех событий через службу исходящих сообщений.
- Вызывает PublishEvents() для публикации всех событий через службу исходящих сообщений.
- Вызывает PublishEvents() для публикации всех событий через службу исходящих сообщений.
- Вызывает PublishEvents() li>
Ожидает подтверждения того, что каждое событие было опубликовано и использовано.
Также IdentityTestHost наследует от WebApplicationFactory
Код: Выделить всё
public class IdentityIntegrationTestBase : IClassFixture, IAsyncLifetime
{
...
protected async Task ProcessAllEvents()
{
var timeout = TimeSpan.FromSeconds(30);
var pollingInterval = TimeSpan.FromSeconds(1);
var stopwatch = Stopwatch.StartNew();
using (var cts = new CancellationTokenSource(timeout))
using (var scope = CreateScope())
{
var harness = GetTestHarness(scope);
await harness.Start();
List publishedEvents;
using (var publishScope = CreateScope())
{
publishedEvents = await PublishEvents(publishScope);
}
try
{
foreach (var publishedEvent in publishedEvents)
{
var eventId = publishedEvent.Id;
var eventType = publishedEvent.Event.GetType();
var isPublished = await harness.Published.Any(p => p.Context.MessageId == eventId, cts.Token);
Assert.True(isPublished, "The event was not published");
var isConsumed = false;
while (!isConsumed && stopwatch.Elapsed < timeout)
{
isConsumed = await harness.Consumed.Any(p => p.Context.MessageId == eventId, cts.Token);
if (!isConsumed)
{
await Task.Delay(pollingInterval, cts.Token);
}
}
Assert.True(isConsumed, "The event was not consumed within the expected time.");
}
}
finally
{
await harness.Stop(cts.Token);
}
}
}
}
Thank you for any insights or advice you can provide!
Источник: https://stackoverflow.com/questions/781 ... ests-xunit