我正在尝试对我的 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>
,但这似乎不起作用,我想我知道为什么。
您实际上可以发布故障消息。尝试这样的事情:
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);