Temporal Go SDK测试中如何为TestWorkflowEnvironment传递自定义context?
Temporal Go SDK 测试环境注入自定义Context解决方法
你遇到的报错是因为Temporal默认不会传递context里的自定义值到活动执行环境,测试环境可以通过以下两种方案解决:
方案1:使用ContextPropagator(推荐,和生产环境逻辑对齐)
Temporal的ContextPropagator组件可以实现工作流、活动之间的自定义上下文值传递,测试和生产环境都可以复用这套逻辑:
- 首先定义自定义的ContextPropagator实现:
import ( "context" "go.temporal.io/sdk/converter" "go.temporal.io/sdk/workflow" ) // 自定义context key避免命名冲突,建议替换原有活动代码里的字符串"stackEnv"为该类型key type contextKey string const StackEnvKey contextKey = "stackEnv" type StackEnvPropagator struct{} func (p *StackEnvPropagator) Inject(ctx context.Context, writer converter.HeaderWriter) error { stackEnv, ok := ctx.Value(StackEnvKey).(*StackEnv) if !ok { return nil } payload, err := converter.GetDefaultDataConverter().ToPayload(stackEnv) if err != nil { return err } writer.Set(string(StackEnvKey), payload) return nil } func (p *StackEnvPropagator) Extract(ctx context.Context, reader converter.HeaderReader) (context.Context, error) { payload, ok := reader.Get(string(StackEnvKey)) if !ok { return ctx, nil } var stackEnv StackEnv if err := converter.GetDefaultDataConverter().FromPayload(payload, &stackEnv); err != nil { return ctx, err } return context.WithValue(ctx, StackEnvKey, &stackEnv), nil }
- 在测试环境中注册Propagator并传入带stackEnv的上下文:
import "go.temporal.io/sdk/worker" // 构造带stackEnv的根上下文 testCtx := context.WithValue(context.Background(), StackEnvKey, yourStackEnvInstance) // 给测试环境配置Propagator s.env.SetWorkerOptions(worker.Options{ ContextPropagators: []workflow.ContextPropagator{&StackEnvPropagator{}}, }) // 执行工作流时传入构造好的上下文 s.env.ExecuteWorkflow(testCtx, EntityCreateWorkflow, wfParams)
方案2:测试环境直接绑定活动上下文(无需修改生产代码)
如果仅需要快速适配测试场景,不想引入Propagator,可以在注册活动时直接绑定带stackEnv的上下文:
import "go.temporal.io/sdk/activity" // 构造带stackEnv的上下文,和原有活动代码的key保持一致 actCtx := context.WithValue(context.Background(), "stackEnv", yourStackEnvInstance) // 注册活动时附加上下文配置 s.env.RegisterActivityWithOptions(EntityCreateActivity, activity.Options{ Context: actCtx, })
注意:该方案仅对当前注册的测试活动生效,不会影响生产逻辑,适合单元测试快速验证场景。
内容的提问来源于stack exchange,提问作者Patrick Finnigan
相关产品推荐
相关产品推荐

