如何测试我的 ConfigureHowToFindSaga 是否在 NServiceBus 中工作

本文关键字:是否 NServiceBus 工作 ConfigureHowToFindSaga 我的 何测试 测试 | 更新日期: 2023-09-27 18:37:23

我今天意识到,艰难的方式,传奇测试不使用ConfigureHowToFindSaga。这导致生产中出现"找不到 Saga"异常,因为我的测试没有涵盖映射,我认为应该覆盖映射。我创建了一个非常简单的示例传奇来说明问题:

public class MySpecialSaga : Saga<MySagaData>,
    IAmStartedByMessages<StartMessage>,
    IHandleMessages<NextMessage>
{
    public void Handle(StartMessage message)
    {
        Data.SagaId = message.Id;
        Console.WriteLine("Saga started with id: " + message.Id);
    }
    public void Handle(NextMessage message)
    {
        Console.WriteLine("Handling next message with id: " + message.Id);
        Bus.Send(new StartMessage() {Id = message.Id + 1});
    }
}
public class NextMessage : ICommand
{
    public int Id { get; set; }
}
public class StartMessage : ICommand
{
    public int Id { get; set; }
}
public class MySagaData : IContainSagaData
{
    public Guid Id { get; set; }
    public string Originator { get; set; }
    public string OriginalMessageId { get; set; }
    public int SagaId { get; set; }
}

现在我有以下两个测试:

[TestFixture]
public class MySpecialSagaTests
{
    public MySpecialSagaTests()
    {
        Test.Initialize();
    }
    [Test]
    public void WhenSagaDoesNotExistItShouldNotFindSaga()
    {
        Test.Saga<MySpecialSaga>()
            .ExpectNotSend<StartMessage>(m => m.Id == 2)
            .When(s => s.Handle(new NextMessage() {Id = 1}));
    }
    [Test]
    public void WhenSagaDoesExistItShouldFindSaga()
    {
        Test.Saga<MySpecialSaga>()
            .When(s => s.Handle(new StartMessage(){ Id = 1}))
            .ExpectNotSend<StartMessage>(m => m.Id == 2)
            .When(s => s.Handle(new NextMessage() {Id = 1}));
    }
}

第一个应该失败,或者至少不发送消息,因为它应该无法找到传奇。当我添加ConfigureHowToFindSaga方法时,第二个测试应该通过。出于某种原因,在测试sagas时不考虑这一点。这可能会导致 saga 中的处理程序由于缺少映射而无法执行。

应如何测试此方案?

如何测试我的 ConfigureHowToFindSaga 是否在 NServiceBus 中工作

目前不支持单元测试映射。这里提到的严格模式将支持这种类型的测试。

https://github.com/Particular/NServiceBus/issues/654