Тестирование MassTransit E2E: события, не учитываемые во времени в нескольких тестах XUnitC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Тестирование MassTransit E2E: события, не учитываемые во времени в нескольких тестах XUnit

Сообщение Гость »


В настоящее время я работаю над комплексным тестированием системы, которая включает обработку событий с использованием MassTransit. Моя стратегия тестирования включает метод PublishEvents(), который взаимодействует со службой исходящих сообщений и публикует все ожидающие события в MassTransit, гарантируя, что для каждого из них установлен messageId. Я также разработал метод ProcessAllEvents(), предназначенный для публикации и последующего подтверждения обработки всех событий.
Этот подход хорошо работает для одного теста. Однако когда я последовательно выполняю несколько тестов, каждый из которых вызывает ProcessAllEvents(), я сталкиваюсь с проблемой: хотя первый тест завершается успешно, последующие тесты имеют тенденцию завершаться неудачно. Похоже, проблема в том, что в этих более поздних тестах события не обрабатываются в течение ожидаемого периода времени, что приводит к сбою.
Вот упрощенная версия того, что делает ProcessAllEvents():
Вот упрощенная версия того, что делает ProcessAllEvents():
p>
  • Запускает новый экземпляр тестового оборудования MassTransit.
  • Вызывает PublishEvents() для публикации всех событий через службу исходящих сообщений.
  • Вызывает PublishEvents() для публикации всех событий через службу исходящих сообщений.
  • Вызывает PublishEvents() для публикации всех событий через службу исходящих сообщений.
  • Вызывает PublishEvents() li>
    Ожидает подтверждения того, что каждое событие было опубликовано и использовано.
Я использую Xunit в качестве тестовой среды.
Также 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);
}
}
}
}

Additionally, if there are best practices for resetting or ensuring a clean state for MassTransit's test harness in between tests, I'd be interested in knowing. My goal is to have each test reliably publish and process events independently of the others.
Thank you for any insights or advice you can provide!


Источник: https://stackoverflow.com/questions/781 ... ests-xunit
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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