当Saga有多个处理程序时,如何为NServiceBus Saga创建单元测试

时间:2011-06-01 14:50:47

标签: unit-testing nservicebus saga

我曾经有过这个测试,它传递得很好(一旦处理了所有三个消息,这个传奇就完成了。

        Test.Saga<TestSagaHandler>(sagaId)
            .When(x =>
            {
                x.Handle(new TestSagaStartMessageOne
                {
                    Id = sagaId
                });
                x.Handle(new TestSagaStartMessageTwo
                {
                    Id = sagaId
                });
                x.Handle(new TestSagaNonStartingMessage
                {
                    Id = sagaId
                });
            });
            .AssertSagaCompletionIs(true);

我现在想要将TestSagaNonStartingMessage分解为自己的处理程序,并执行以下操作:

        Test.Saga<TestSagaHandler>(sagaId)
            .When(x =>
            {
                x.Handle(new TestSagaStartMessageOne
                {
                    Id = sagaId
                });
                x.Handle(new TestSagaStartMessageTwo
                {
                    Id = sagaId
                });
            });

        Test.Saga<TestSagaHandlerSingleMessage>(sagaId)
            .When(x =>
                x.Handle(new TestSagaNonStartingMessage
                {
                    Id = sagaId
                })
            )
        .AssertSagaCompletionIs(true);

但是,在处理TestSagaNonStartingMessage时 - 传统数据不会保留在以前的处理程序中。

我是否存在持久性问题,或者测试结构是否很糟糕?

2 个答案:

答案 0 :(得分:3)

测试结构不正确 - 请查看制造样本中的测试项目,看看它应该如何构建。简短的回答是链接第二个。在第一个之后(...)。

答案 1 :(得分:1)

对于其他读者参考,正确的测试结构应类似于:

    Test.Saga<TestSagaHandler>(sagaId)
        .When(x =>
        {
            x.Handle(new TestSagaStartMessageOne { Id = sagaId });
            x.Handle(new TestSagaStartMessageTwo { Id = sagaId });
        })
        .When(x =>
            x.Handle(new TestSagaNonStartingMessage { Id = sagaId })
        )
        .AssertSagaCompletionIs(true);

正如Udi所说,链接&#34;当&#34;条款一起。

此外,为了从测试中获得更多价值,请考虑引入例外,例如ExpectSend<>ExpectPublish等。

参考:http://docs.particular.net/nservicebus/testing/