如果我想使用
测试一个传奇,我应该采取什么方法 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实例的引用。
答案 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"));
}
即,
FakeBus
这是IBus
实施,以FakeBusEvent
,MessageSent<TCommandMessage>
等形式收集MessagePublished<TEventMessage>
。SagaFixture
并注入FakeBus
实例FakeBus
IBus
中的SagaFixture
实例无法访问,因为它仅用于提供最真实的环境以将消息传递给您的传奇 - 事实上,它是一个功能完备的总线实例恰好在内存传输的实现,saga persister等上运行。