使用 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"));
}
即
- 创建
FakeBus
,这是一个 IBus
实现,以 MessageSent<TCommandMessage>
、MessagePublished<TEventMessage>
等形式收集 FakeBusEvent
s
- 将工厂方法传递给
SagaFixture
并注入您的 FakeBus
实例
- 检查
FakeBus
是否完成了预期的事情
无法访问 SagaFixture
中的 IBus
实例,因为它仅用于为您的 saga 传递消息提供最真实的环境——事实上,它是一个功能齐全的总线运行 在 in-mem transport、saga persister 等实现上恰好发生的实例
如果我想使用
测试 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"));
}
即
- 创建
FakeBus
,这是一个IBus
实现,以MessageSent<TCommandMessage>
、MessagePublished<TEventMessage>
等形式收集FakeBusEvent
s - 将工厂方法传递给
SagaFixture
并注入您的FakeBus
实例 - 检查
FakeBus
是否完成了预期的事情
无法访问 SagaFixture
中的 IBus
实例,因为它仅用于为您的 saga 传递消息提供最真实的环境——事实上,它是一个功能齐全的总线运行 在 in-mem transport、saga persister 等实现上恰好发生的实例