如何对构建和执行路由清单的MassTransit使用者进行单元测试?

时间:2018-06-21 02:19:18

标签: unit-testing .net-core masstransit routing-slip

在.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存储库中搜索了很多内容,但没有任何问题。

1 个答案:

答案 0 :(得分:1)

看看如何编写Courier测试,有许多测试夹具可用于测试布线单活动。虽然没有充分的文档记录,但是单元测试是如何使用测试的有效证明。

https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit.Tests/Courier/TwoActivityEvent_Specs.cs