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

Akka.NET FSM OnTermination过渡逻辑测试失败原因及正确实现方案

Akka.NET FSM OnTermination逻辑测试问题解答

第一个测试用例失败原因

有两个核心问题:

  • 你的State枚举仅定义了Idle、Active两个值,代码中return GoTo(State.Done)存在编译错误,无法正常执行。就算你补充了Done枚举值,GoTo方法仅用于切换FSM内部状态,不会触发FSM的终止流程,自然不会执行OnTermination回调。你观测到进入OnTermination代码段属于误差,实际上该段逻辑在第一个测试中并未执行。
  • 只有当FSM主动终止、或者收到系统终止消息导致Actor销毁时,才会触发OnTermination回调,你当前的业务逻辑没有触发终止动作。

第二个测试用例正确性判断

第二个测试用例写法正确。PoisonPill是Akka.NET提供的系统级终止消息,会按正常流程终止Actor,触发FSM的OnTermination回调,所以可以正常收到termination消息,测试通过符合预期。

正确的OnTermination测试方式

分两种测试场景选择写法:

场景1:测试业务逻辑主动触发FSM终止的场景

修改FSM的Idle状态处理逻辑,将GoTo(State.Done)替换为Stop(),主动触发FSM终止:

When(State.Idle, state =>
{
    if (state.FsmEvent is ExampleEvent ex && state.StateData is Uninitialized)
    {
        // Stop方法会触发FSM终止流程,执行OnTermination回调
        return Stop();
    }
    return null;
});

修改后第一个测试用例即可正常运行。

场景2:测试Actor被动终止的场景

直接使用第二个测试的写法,发送PoisonPill或者Kill消息触发Actor终止即可验证OnTermination逻辑。

测试优化建议

可以给ExpectMsg加上超时参数,避免测试异常时无限等待:

// 最多等待1秒确认收到消息
ExpectMsg("termination", TimeSpan.FromSeconds(1));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:57:05