Как ввести начальное состояние в сагу в тестовом жгуте MassTransit?

#c# #.net #unit-testing #masstransit

Вопрос:

В предыдущих версиях MassTransit при написании модульных тестов я использовал начальное состояние саги, вызывая InMemorySagaRepository.Add() метод:

 private InMemorySagaRepository<TState> Repository { get; }

protected async Task SeedSaga<TState>(TState seedState)
    where TState : class, SagaStateMachineInstance
{
    await Repository.Add(new SagaInstance<TState>(seedState), default);
}
 

Этот метод добавит запись для саги в желаемом состоянии в хранилище, которая может быть использована в качестве отправной точки для моих тестов.

Теперь я обновился до версии 7.2.1 MassTransit, и этот метод больше недоступен.

Можно ли заполнить данные в текущей версии InMemorySagaRepository ? Если нет, то какой подход можно было бы использовать для достижения аналогичных результатов?

Спасибо.

Ответ №1:

В конце прошлого года была дискуссия на эту тему. Таким образом, вам необходимо использовать тестовый жгут в памяти на основе контейнеров.

 var services = new ServiceCollection();
services.AddMassTransitInMemoryTestHarness(x => 
{
    x.AddSagaStateMachineTestHarness<MySagaStateMachine, MySagaState>();
    x.AddSagaStateMachine<MySagaStateMachine, MySagaState>()
        .InMemoryRepository();
});
var provider = services.BuildServiceProvider();
 

Получите и запустите тестовый жгут (не забудьте, наконец, остановить его):

 var harness = provider.GetRequiredService<InMemoryTestHarness>();
await harness.Start();
 

Вы можете получить словарь saga и добавить свой экземпляр saga, заполненный:

 var dictionary = provider.GetRequiredService<IndexedSagaDictionary<MySagaState>>();
dictionary.Add(new SagaInstance(new MySagaState 
{ 
    CorrelationId = ...,
    OtherProperty = ...
}));
 

Связанное обсуждение также содержит некоторые полезные методы расширения.