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

Telegraf.js文本处理器测试问题:类内监听器未触发processText

你的Telegraf.js文本处理器测试错误分析

核心错误点

  • on方法调用完全错误:你测试里写的auth.on(message.message('text'), ctx)不符合Telegraf的API逻辑。on方法的第二个参数必须是事件回调函数,而不是上下文对象。这么写相当于注册了一个无效监听器,根本不会触发processText。
  • 未触发事件或回调:你没有让Telegraf的事件机制真正触发文本消息事件,也没有直接调用构造函数里注册的回调函数,导致processText始终没被执行。
  • 异步测试未等待:测试用了async但没等待异步操作完成,断言会在processTextStub执行前就运行,必然失败。

修正后的测试代码示例

runAuthSceneTests() {
    let auth;
      
    beforeEach(() => {
      auth = new AuthScene(this.queries, this.cfg);
    });
      
    describe('Обработчик ON message для класса AuthScene', () => {
      afterEach(() => {
        sinon.restore();
      });

      it('В данном тесте должен вызваться метод processText, после того как пользователь отправит сообщение боту', async () => {  
        const ctx = { message: { text: 'test' } };
        const processTextStub = sinon.stub(auth, 'processText').resolves();
        
        // 获取构造函数中注册的文本消息回调并执行
        const textEventKey = message.message('text');
        const textHandlers = auth._events[textEventKey];
        await Promise.all(textHandlers.map(handler => handler(ctx)));
        
        assert(processTextStub.calledOnce);
      });
    });
    
    after(() => {
      setTimeout(() => {
        process.exit(0);
      }, 1500);
    });
  }

替代方案(如果_events不可访问)

可以在AuthScene构造函数里把回调存为类属性:

// AuthScene构造函数内
this.textMessageHandler = async (ctx) => this.processText(ctx);
this.on(message.message('text'), this.textMessageHandler);

然后测试里直接调用该属性:

// 测试用例内
await auth.textMessageHandler(ctx);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:19:51