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

.NET中为OpenTelemetry追踪添加自定义属性的单元测试方案

单元测试MassTransit过滤器中OpenTelemetry标签设置的解决方案

要解决测试中Activity.Current为空的问题,核心是在单元测试上下文里手动模拟分布式追踪的Activity环境,具体实现如下:

1. 配置测试用的Activity监听

在测试类的初始化方法中,注册一个ActivityListener,确保测试环境能捕获并处理Activity:

[TestInitialize]
public void Setup()
{
    ActivitySource.AddActivityListener(new ActivityListener
    {
        ShouldListenTo = source => source.Name == "你的项目ActivitySource名称",
        Sample = (ref ActivityCreationOptions<ActivityContext>) => ActivitySamplingResult.AllData,
    });
}

2. 手动创建并激活Activity上下文

在测试方法里,先启动一个Activity,让Activity.Current有值,再执行你的过滤器逻辑:

[TestMethod]
public async Task CustomFilter_Adds_Expected_Tag_To_Activity()
{
    // 启动测试用Activity
    using var testActivity = new Activity("Test-MassTransit-Consume").Start();

    // 模拟MassTransit消费上下文(根据你的过滤器依赖构造对应实例)
    var mockContext = new Mock<ConsumeContext<YourMessageType>>();
    // 按需设置mockContext的必要属性,比如Message等

    // 实例化过滤器并执行
    var filter = new YourCustomMtFilter();
    await filter.Send(mockContext.Object, () => Task.CompletedTask);

    // 验证标签是否正确添加
    Assert.IsTrue(testActivity.Tags.ContainsKey("bf.my_attribute"));
    Assert.AreEqual("myAttributeValue", testActivity.Tags["bf.my_attribute"]);
}

3. 简化MassTransit上下文模拟

如果觉得手动Mock上下文太麻烦,可以用MassTransit的TestHarness,它能帮你快速构造测试用的管道和上下文:

[TestMethod]
public async Task Filter_Adds_Tag_Using_TestHarness()
{
    using var testActivity = new Activity("Test-Harness").Start();
    
    var harness = new InMemoryTestHarness();
    // 注册你的自定义过滤器到管道
    harness.Consumer(() => new YourConsumer(), cfg => cfg.AddFilter(new YourCustomMtFilter()));
    
    await harness.Start();
    try
    {
        // 发送测试消息
        await harness.InputQueueSendEndpoint.Send(new YourMessageType());
        
        // 等待消息处理完成
        await harness.Consumed.Any<YourMessageType>();
        
        // 验证Activity标签
        Assert.IsTrue(testActivity.Tags.ContainsKey("bf.my_attribute"));
    }
    finally
    {
        await harness.Stop();
    }
}

4. 测试后清理

在测试清理方法中确保Activity被正确停止,避免污染其他测试:

[TestCleanup]
public void Teardown()
{
    Activity.Current?.Stop();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:50:03