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

如何测试使用activity.GetLogger(ctx)的Temporal代码?

如何在测试中获取合法的Temporal活动上下文?

问题场景

我有一个Temporal活动函数:

func logSomething(ctx context.Context) {
  log := activity.GetLogger(ctx)
  log.Info("logging something")
}

直接用logSomething(context.Background())测试调用时,会触发panic:

test panicked: getActivityOutboundInterceptor: Not an activity context

我尝试通过自定义拦截器注入上下文,但用字符串"activityInterceptor"作为ContextKey无法匹配内部的activityInterceptorContextKey,问题依旧,使用的是temporalio sdk-go v1.17.0版本。

解决方法

方法1:用官方测试套件构造上下文(推荐)

temporalio官方的activity/testsuite包提供了专门的测试工具,能直接生成合法的活动上下文,自动注入Logger等依赖:

import (
  "testing"
  "github.com/temporalio/sdk-go/activity"
  "github.com/temporalio/sdk-go/activity/testsuite"
)

func TestLogSomething(t *testing.T) {
  suite := &testsuite.ActivityTestSuite{}
  ctx, _ := suite.NewActivityContext(t, nil)
  
  // 现在可正常调用目标函数
  logSomething(ctx)
}

方法2:反射获取内部ContextKey(不推荐)

如果不想依赖测试套件,可以通过反射拿到未导出的activityInterceptorContextKey,再注入自定义拦截器:

import (
  "context"
  "reflect"
  "github.com/temporalio/sdk-go/activity"
  "github.com/temporalio/sdk-go/interceptor"
  "github.com/temporalio/sdk-go/log"
)

// 自定义拦截器实现Logger方法
type fakeActivityOutboundInterceptor struct {
  interceptor.ActivityOutboundInterceptorBase
}

func (f *fakeActivityOutboundInterceptor) GetLogger(_ context.Context) log.Logger {
  // 返回自定义Logger实例,这里用默认示例
  return log.NewDefaultLogger()
}

func TestLogSomething(t *testing.T) {
  // 反射获取内部未导出的contextKey
  var activityInterceptorKey interface{}
  internalActivityPkg := reflect.TypeOf(activity.GetLogger).PkgPath()
  // 定位内部包的contextKey字段
  internalType, _ := reflect.ValueOf(&struct{}{}).Type().Elem().FieldByName("activityInterceptorContextKey")
  if internalType.IsValid() {
    activityInterceptorKey = internalType.Interface()
  }

  // 构造合法上下文
  ctx := context.WithValue(
    context.Background(),
    activityInterceptorKey,
    &fakeActivityOutboundInterceptor{},
  )

  logSomething(ctx)
}

⚠️ 注意:这种方法依赖SDK内部实现,版本更新可能失效,优先用官方测试套件。

内容的提问来源于stack exchange,提问作者Zoltán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:32:01