在 .NET Core 2.0 中,我有一个相当简单的 MassTransit 路由单,其中包含 2 个活动。这是在消费者中构建和执行的,并且都与自动状态机相关联。尽管需要进行一些最终的干净调整,但这一切都很好。
但是,我无法确定为我的消费者编写单元测试的最佳方式,因为它会构建路由单。我的消费者中有以下代码:
public async Task Consumer(ConsumerContext<ProcessRequest> context)
{
var builder = new RoutingSlipBuilder(NewId.NextGuid());
SetupRoutingSlipActivities(builder, context);
var routingSlip = builder.Build();
await context.Execute(routingSlip).ConfigureAwait(false);
}
我创建了 SetupRoutingSlipActivities 方法,因为我认为它可以帮助我编写测试以确保添加了正确的活动,它看起来像:
public void SetupRoutingSlipActivities(RoutingSlipBuilder builder, ConsumeContext<IProcessCreateLinkRequest> context)
{
builder.AddActivity(
nameof(ActivityOne),
new Uri("execute_activity_one_example_address"),
new ActivityOneArguments(
context.Message.Id,
context.Message.Name)
);
builder.AddActivity(
nameof(ActivityTwo),
new Uri("execute_activity_two_example_address"),
new ActivityTwoArguments(
context.Message.AnotherId,
context.Message.FileName)
);
}
我尝试使用 Moq 模拟构建器和 MassTransit InMemoryTestHarness 为 SetupRoutingSlipActivities 编写测试,但我发现 AddActivity 方法不是虚拟的,所以我无法验证它:
aRoutingSlipBuilder.Verify(x => x.AddActivity(
nameof(ActivityOne),
new Uri("execute_activity_one_example_address"),
It.Is<ActivityOne>(y => y.Id == 1 && y.Name == "A test name")));
请忽略代码示例中的一些奇怪数据,因为我只是提供了一个简化版本。
有人对如何做到这一点有任何建议吗?我还想测试以确保创建了 RoutingSlipBuilder 但由于该实例是在 Consume 方法中创建的,所以我不知道该怎么做!我在网上和通过 MassTransit 存储库进行了很多搜索,但没有什么特别突出的。