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

Temporal Go SDK单元测试调用子工作流报unable to find workflow type如何解决

Temporal Go SDK单元测试子工作流未注册报错解决

报错原因

  • Temporal的TestWorkflowEnvironment单元测试环境是完全隔离的运行环境,不会自动复用你业务代码中给生产worker做的注册逻辑,你在init函数中调用worker.RegisterWorkflow的内容对测试环境不生效。
  • 你当前的子工作流Mock规则参数匹配不完整,导致Mock规则没有命中。测试环境在Mock未命中的情况下会尝试查找真实注册的子工作流实现,找不到就抛出你遇到的报错。

修复方法

方法一:修正子工作流Mock规则(单元测试优先选这个,不需要依赖子工作流的真实实现)

OnWorkflow方法的参数需要和你父工作流启动子工作流时的传参完全匹配:第一个参数是子工作流函数,第二个参数是固定的mock.Anything匹配工作流context,后面的参数需要和你传给子工作流的参数数量、类型匹配,或者统一用mock.Anything占位。
比如你启动LoadLifecycleWorkflow时传了2个业务参数,Mock写法调整为:

// 第3、4位的mock.Anything对应子工作流的2个入参,根据你实际入参数量调整个数
s.env.OnWorkflow(LoadLifecycleWorkflow, mock.Anything, mock.Anything, mock.Anything).Return(nil).Once()

补全参数后Mock规则就能正确命中,测试环境就不会再去查找真实的子工作流注册信息。

方法二:在测试环境中注册子工作流(适合需要真实执行子工作流逻辑的测试场景)

在测试环境初始化时把用到的所有工作流、活动都注册到TestWorkflowEnvironment实例上:

func (s *UnitTestSuite) SetupTest() {
    s.env = s.NewTestWorkflowEnvironment()
    // 注册所有测试依赖的工作流、活动
    s.env.RegisterWorkflow(LoadCreateWorkflow)
    s.env.RegisterWorkflow(LoadLifecycleWorkflow)
    s.env.RegisterActivity(CreateLoadActivity)
}

如果用这个方法不需要Mock子工作流也能正常运行,需要Mock的话还是要保留正确的Mock规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:06:03