使用 SagaFixture 测试依赖于 IBus 的 sagas

Testing sagas dependent on IBus using SagaFixture

如果我想使用

测试 saga,我应该采用什么方法
 using(var fixture = SagaFixture.For<CollectLegalInfoSaga>())
    {
        // perform test in here
    }

传奇依赖于被注入的 IBus 实例(构造函数或 属性。如果总线 属性 为空,传奇中的一个或多个处理程序将失败。

public class CollectLegalInfoSaga : Saga<CollectLegalInfoSagaData>,
      IAmInitiatedBy<CustomerCreated>,
      IHandleMessages<LegalInfoAcquiredInFirstSystem>,
      IHandleMessages<LegalInfoAcquiredInSecondSystem>
    {
        public IBus Bus {get;set;}

    }

据我所知,SagaFixture 包装了 _activator,它持有对 IBus 实例的引用。

我建议你这样做:

// this one implements IBus
var fakeBus = new FakeBus();

using(var fixture = SagaFixture.For(() => new CollectLegalInfoSaga(fakeBus)))
{
    // dispatch message(s) to saga here by calling
    // fixture.Deliver(message);
    // 
    // (....)
    //
    // assert that certain things have happened
    var sentRequests = fakeBus.Events
        .OfType<MessageSent<GetLegaInfoRequest>>()
        .ToList();

    Assert.That(sentRequests.Count, Is.EqualTo(1));

    var actualRequest = sentRequests.Single().CommandMessage;

    Assert.That(request.LegalEntityId, Is.EqualTo("wwwwhatever"));
}

  1. 创建 FakeBus,这是一个 IBus 实现,以 MessageSent<TCommandMessage>MessagePublished<TEventMessage> 等形式收集 FakeBusEvents
  2. 将工厂方法传递给 SagaFixture 并注入您的 FakeBus 实例
  3. 检查 FakeBus
  4. 是否完成了预期的事情

无法访问 SagaFixture 中的 IBus 实例,因为它仅用于为您的 saga 传递消息提供最真实的环境——事实上,它是一个功能齐全的总线运行 在 in-mem transport、saga persister 等实现上恰好发生的实例