#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 = ...
}));
Связанное обсуждение также содержит некоторые полезные методы расширения.