1

在 .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 存储库进行了很多搜索,但没有什么特别突出的。

4

1 回答 1

1

看看 Courier 测试是如何编写的,有许多测试夹具可用于测试路由滑动活动。虽然它们没有得到很好的记录,但单元测试是如何使用测试的有效证明。

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

于 2018-06-21T15:11:27.373 回答