使用SagaFixture测试依赖于IBus的传单

时间:2017-01-17 09:01:52

标签: rebus

如果我想使用

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

saga依赖于注入的IBus实例(构造函数或属性。如果Bus属性为null,则saga中的一个或多个处理程序将失败。

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

    }

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

1 个答案:

答案 0 :(得分:0)

我建议你这样做:

// 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实施,以FakeBusEventMessageSent<TCommandMessage>等形式收集MessagePublished<TEventMessage>
  2. 将工厂方法传递给SagaFixture并注入FakeBus实例
  3. 检查FakeBus
  4. 是否已完成预期的操作

    IBus中的SagaFixture实例无法访问,因为它仅用于提供最真实的环境以将消息传递给您的传奇 - 事实上,它是一个功能完备的总线实例恰好在内存传输的实现,saga persister等上运行。