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
相关产品推荐
相关产品推荐

