'How to test MassTransit saga state machine with certain state?
I have state machine build with MassTransit
:
public class OrderStateMachine : MassTransitStateMachine<Order>
{
public State Completed { get; init; }
public State Rejected { get; init; }
public OrderStateMachine()
{
Event(() => OrderCreated, x => x.CorrelateById(context => context.Message.OrderId));
Event(() => OrderCompleted, x => x.CorrelateById(context => context.Message.OrderId));
Request(() => ReserveStock, cfg => { cfg.Timeout = TimeSpan.FromMinutes(1); });
Request(() => Checkout, cfg => { cfg.Timeout = TimeSpan.FromMinutes(1); });
InstanceState(x => x.CurrentState,
ReserveStock.Pending,
Checkout.Pending,
Completed,
Rejected);
Initially(
When(OrderCreated)
.Then(x =>
{
x.Saga.UserId = x.Message.UserId;
x.Saga.CreatedOn = DateTime.UtcNow;
})
.Request(ReserveStock, x => new ReserveStock
{
OrderId = x.Saga.CorrelationId,
UserId = x.Saga.UserId
})
.TransitionTo(ReserveStock.Pending));
During(ReserveStock.Pending,
When(ReserveStock.Completed)
.Then(x => x.Saga.ProductId = x.Message.ProductId)
.Request(Checkout, x => new Checkout
{
OrderId = x.Saga.CorrelationId,
UserId = x.Saga.UserId
})
.TransitionTo(Checkout.Pending),
When(ReserveStock.Faulted)
.TransitionTo(Rejected),
When(ReserveStock.TimeoutExpired)
.TransitionTo(Rejected));
}
public Event<OrderCreated> OrderCreated { get; init; }
public Event<OrderCompleted> OrderCompleted { get; init; }
public Request<Order, ReserveStock, StockReserved> ReserveStock { get; init; }
public Request<Order, Checkout, PaymentCompleted> Checkout { get; init; }
}
Can't figure out how to create unit test for that state machine with initial state ReserveStock.Pending
to test only ReserveStock.Completed
transition. I have tried method with dictionary from here
[Fact]
public async Task StockReserved_Cause_Transition_To_Checkout_Pending()
{
await using var provider = _testFixture.GetProvider();
var harness = provider.GetRequiredService<ITestHarness>();
await harness.Start();
var dictionary = provider.GetRequiredService<IndexedSagaDictionary<Order>>();
dictionary.Add(new SagaInstance<Order>(new Order
{
CorrelationId = _orderId,
CurrentState = 3
}));
var sendEndpoint = await harness.Bus.GetPublishSendEndpoint<StockReserved>();
await sendEndpoint.Send(new StockReserved
{
OrderId = _orderId,
UserId = _userId,
ProductId = _productId,
});
var sagaHarness = harness.GetSagaStateMachineHarness<OrderStateMachine, Order>();
await sagaHarness.Sagas.Any();
}
but it does nothing
or i missed something
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|