由 saga 状态机中的故障<T>消息引发的测试事件

问题描述 投票:0回答:1

我正在尝试对我的 MassTransit saga 状态机进行单元测试

During(
                Processing,
                When(CreateAgreementFaulted)
                    .Then(
                        behaviorContext => behaviorContext.Saga.NumberOfDocumentsFailed += 1)
                    .If(
                        context => context.Saga.NumberOfDocumentsCreated + context.Saga.NumberOfDocumentsFailed == context.Saga.NumberOfDocumentsToCreate,
                        (s) => s.TransitionTo(Done)),
                When(AgreementCreated)
                    .Then(
                        behaviorContext => behaviorContext.Saga.NumberOfDocumentsCreated += 1)
                    .If(
                        context => context.Saga.NumberOfDocumentsCreated + context.Saga.NumberOfDocumentsFailed == context.Saga.NumberOfDocumentsToCreate,
                        (s) => s.TransitionTo(Done)));
public Event<Fault<CreateAgreementMessage>> CreateAgreementFaulted { get; private set; }
public Event<CreatedAgreementMessage> AgreementCreated { get; private set; } = null!;

我可以在测试工具发布时测试功能

await TestHarness.Bus.Publish(new CreatedAgreementMessage);
,但我还想测试消费者在尝试使用
CreateAgreementMessage
时抛出错误。

也许我滥用了系统,应该让消费者发布

CreateAgreementFailMessage
,而不是让它抛出异常。

这是我测试AgreementCreated 事件的方法:

[Fact]
        public async Task When_in_state_Processing_all_successful_documents_processed_Then_transition_to_Done()
        {
            var createdAgreementMessage = Fixture.Create<CreatedAgreementMessage>();

            await SaveSagaInstance(new CreateAgreementsState()
            {
                CorrelationId = createdAgreementMessage.RequestCorrelationId,
                NumberOfDocumentsFailed = 0,
                NumberOfDocumentsCreated = 0,
                NumberOfDocumentsToCreate = 1,
                CurrentState = nameof(CreateAgreementsStateMachine.Processing),
            });

            await TestHarness.Bus.Publish(createdAgreementMessage);
            
            var isConsumed = await GetSagaStateMachineHarness().Consumed.Any<CreatedAgreementMessage>();
            var isInDone = await GetSagaStateMachineHarness().Sagas.Any(s => s.CurrentState == nameof(CreateAgreementsStateMachine.Done));

            isConsumed.Should().BeTrue();
            isInDone.Should().BeTrue();
        }

我尝试过发布

Fault<CreateAgreementMessage>
,但这似乎不起作用,我想我知道为什么。

unit-testing masstransit
1个回答
0
投票

您实际上可以发布故障消息。尝试这样的事情:

await harness.Bus.Publish<Fault<CreateAgreementMessage>>(new
{
     Message = new { CorrelationId = createdAgreementMessage.RequestCorrelationId }
});

如果您想验证状态是否已转移到您预期的状态,您还可以添加以下内容:

var sagaState = provider.GetRequiredService<IndexedSagaDictionary<YOUR_STATE>>();
sagaState.Add(new SagaInstance<ReAllocationState>(new ReAllocationState
{
     CorrelationId = createdAgreementMessage.RequestCorrelationId,
     CurrentState = nameof(CreateAgreementsStateMachine.Processing)
}));

var sagaHarness = GetSagaStateMachineHarness();

(await sagaHarness.Consumed.Any<Fault<CreateAgreementMessage>>()).Should().BeTrue();

(await sagaHarness.Exists(correlationId, sagaHarness.StateMachine.Faulted)) // Your expected state
        .Should().NotBeNull()
        .And
        .Be(correlationId);
© www.soinside.com 2019 - 2024. All rights reserved.