'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

enter image description here

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