You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于NUnit、NSubstitute的MassTransit Azure Service Bus消费者测试问询

MassTransit消费者单元测试实现方案(Azure Service Bus)

核心思路

不需要连接真实的Azure Service Bus或启动MassTransit总线,单元测试聚焦于消费者Consume方法的业务逻辑。直接实例化消费者,模拟ConsumeContext和依赖服务,手动触发Consume调用,验证逻辑正确性。

测试前置准备

确保项目已安装以下NuGet包:

  • NUnit
  • NSubstitute
  • NFluent
  • MassTransit(消费者代码依赖)

代码示例

1. 消费者示例代码

假设你的消费者结构如下:

public class DatasetDownloadedConsumer : IConsumer<DatasetDownloadedMessage>
{
    private readonly IDatasetProcessor _datasetProcessor;

    public DatasetDownloadedConsumer(IDatasetProcessor datasetProcessor)
    {
        _datasetProcessor = datasetProcessor;
    }

    public async Task Consume(ConsumeContext<DatasetDownloadedMessage> context)
    {
        // 业务逻辑:处理下载完成的数据集消息
        await _datasetProcessor.ProcessDataset(context.Message.DatasetId);
    }
}

// 消息定义
public record DatasetDownloadedMessage(Guid DatasetId);

// 依赖服务接口
public interface IDatasetProcessor
{
    Task ProcessDataset(Guid datasetId);
}

2. NUnit测试实现

using NUnit.Framework;
using NSubstitute;
using NFluent;
using MassTransit;

[TestFixture]
public class DatasetDownloadedConsumerTests
{
    private IDatasetProcessor _mockDatasetProcessor;
    private DatasetDownloadedConsumer _consumer;

    [SetUp]
    public void Setup()
    {
        // 初始化模拟依赖
        _mockDatasetProcessor = Substitute.For<IDatasetProcessor>();
        // 实例化消费者,注入模拟依赖
        _consumer = new DatasetDownloadedConsumer(_mockDatasetProcessor);
    }

    [Test]
    public async Task Consume_WhenReceivesDatasetDownloadedMessage_ShouldCallProcessDataset()
    {
        // 1. 准备测试数据
        var testDatasetId = Guid.NewGuid();
        var message = new DatasetDownloadedMessage(testDatasetId);

        // 2. 模拟ConsumeContext
        var mockContext = Substitute.For<ConsumeContext<DatasetDownloadedMessage>>();
        mockContext.Message.Returns(message);

        // 3. 触发Consume方法
        await _consumer.Consume(mockContext);

        // 4. 验证业务逻辑是否执行
        await _mockDatasetProcessor.Received(1).ProcessDataset(testDatasetId);
        Check.That(testDatasetId).IsEqualTo(message.DatasetId);
    }
}

关键说明

  • 模拟ConsumeContext:用NSubstitute创建ConsumeContext<DatasetDownloadedMessage>的实例,通过Returns方法设置Message属性,模拟队列消息的传入。
  • 依赖验证:通过NSubstitute的Received方法验证依赖服务的方法是否被正确调用(次数、参数是否匹配)。
  • 断言逻辑:用NFluent的Check类验证数据或状态是否符合预期,语法更简洁直观。

内容的提问来源于stack exchange,提问作者Joan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:15:39