0

I'm stuck and the docks for the lib are unhelpful. Given the below saga definition:

public class GetOrdersStateMachine : MassTransitStateMachine<GetOrdersState>
{
    public State? FetchingOrdersAndItems { get; private set; }

    public Event<GetOrders>? GetOrdersIntegrationEventReceived { get; private set; }

    public GetOrdersStateMachine()
    {
        Initially(
            When(GetOrdersIntegrationEventReceived)
                .Activity(AddAccountIdToState)
                .TransitionTo(FetchingOrdersAndItems));
    }

    private EventActivityBinder<GetOrdersState, GetOrders> AddAccountIdToState(
        IStateMachineActivitySelector<GetOrdersState, GetOrders> sel) =>
        sel.OfType<AddAccountIdToStateActivity>();
}

And the below activity definition:

public class AddAccountIdToStateActivity : Activity<GetOrdersState, GetOrders>
{
    private readonly IPartnerService _partnerService;

    public AddAccountIdToStateActivity(IPartnerService partnerService) => _partnerService = partnerService;

    public void Probe(ProbeContext context) => 
        context.CreateScope($"GetOrders{nameof(AddAccountIdToStateActivity)}");

    public void Accept(StateMachineVisitor visitor) => visitor.Visit(this);

    public async Task Execute(
        BehaviorContext<GetOrdersState, GetOrders> context,
        Behavior<GetOrdersState, GetOrders> next)
    {
        context.Instance.AccountId = await _partnerService.GetAccountId(context.Data.PartnerId);

        await next.Execute(context);
    }

    public Task Faulted<TException>(
        BehaviorExceptionContext<GetOrdersState, GetOrders, TException> context,
        Behavior<GetOrdersState, GetOrders> next) where TException : Exception => 
        next.Faulted(context);
}

And the below test definition:

var machine = new GetOrdersStateMachine();
var harness = new InMemoryTestHarness();
var sagaHarness = harness.StateMachineSaga<GetOrdersState, GetOrdersStateMachine>(machine);
var @event = new GetOrders("1", new[] {MarketplaceCode.De}, DateTime.UtcNow);

await harness.Start();

try
{
    await harness.Bus.Publish(@event);
    await harness.Bus.Publish<ListOrdersErrorResponseReceived>(new
    {
        @event.CorrelationId,
        AmazonError = "test"
    });

    var errorMessages = sagaHarness.Consumed.Select<ListOrdersErrorResponseReceived>().ToList();
    var sagaResult = harness.Published.Select<AmazonOrdersReceived>().ToList();
    var state = sagaHarness.Sagas.Contains(@event.CorrelationId);

    harness.Consumed.Select<GetOrders>().Any().Should().BeTrue();
    sagaHarness.Consumed.Select<GetOrders>().Any().Should().BeTrue();
    harness.Consumed.Select<ListOrdersErrorResponseReceived>().Any().Should().BeTrue();
    errorMessages.Any().Should().BeTrue();
    sagaResult.First().Context.Message.IsFaulted.Should().BeTrue();
    errorMessages.First().Context.Message.CorrelationId.Should().Be(@event.CorrelationId);
    errorMessages.First().Context.Message.AmazonError.Should().Be("test");
    state.IsFaulted.Should().BeTrue();
}
finally
{
    await harness.Stop();
}

As you can see, the AddAccountToStateActivity has a dependency on the IPartnerService. I can't figure a way to configure that dependency.There's nothing in the docs and neither can I find anything on the github. How do I do it?

Marek M.
  • 3,799
  • 9
  • 43
  • 93

1 Answers1

-1

Thanks to the help of one of the library's authors I ended up writing this code:

private static (InMemoryTestHarness harness, IStateMachineSagaTestHarness<GetOrdersState, GetOrdersStateMachine> sagaHarness) ConfigureAndGetHarnesses()
{
    var provider = new ServiceCollection()
        .AddMassTransitInMemoryTestHarness(cfg =>
        {
            cfg.AddSagaStateMachine<GetOrdersStateMachine, GetOrdersState>().InMemoryRepository();
            cfg.AddSagaStateMachineTestHarness<GetOrdersStateMachine, GetOrdersState>();
        })
        .AddLogging()
        .AddSingleton(Mock.Of<IPartnerService>())
        .AddSingleton(Mock.Of<IStorage>())
        .BuildServiceProvider(true);
    var harness = provider.GetRequiredService<InMemoryTestHarness>();
    var sagaHarness = provider
        .GetRequiredService<IStateMachineSagaTestHarness<GetOrdersState, GetOrdersStateMachine>>();
    
    return (harness, sagaHarness);
}

As you can see I'm registering my mocks with the ServiceProvider.

Marek M.
  • 3,799
  • 9
  • 43
  • 93
  • 1
    Glad you got it working. Was also asked [here](https://stackoverflow.com/questions/65412633/how-to-use-masstransit-test-harness-to-test-sagas-with-activities-automatonymou), which links the documentation you found. – Chris Patterson Feb 24 '21 at 13:46