本地运行Node.js单元测试AWS Lex聊天机器人时遇TypeError问题
控制台测试一切正常,本地Node.js单元测试却栽在了FulfillmentCodeHook with no slots这个错误上,还跟着半截TypeError,这种情况我之前也碰到过,大概率是本地测试的请求格式、代码容错逻辑或者测试用例的问题,给你几个具体的排查和解决方向:
核对测试请求的结构
本地单元测试里你构造的请求payload得和Lex控制台实际发送的完全对齐。尤其是当用户问题没触发任何slot填充时,Lex会发送一个不带currentIntent.slots(或者该字段是空对象)的请求,你得检查下本地测试用例是不是没模拟这个场景。举个正确的无slot请求结构例子:{ "sessionAttributes": {}, "currentIntent": { "name": "YourIntentName", "slots": {}, "confirmationStatus": "None" }, "bot": { "name": "YourBotName", "alias": "$LATEST", "version": "$LATEST" }, "userId": "test-user-id" }给slots处理加容错逻辑
你的 fulfillment 代码可能默认认为currentIntent.slots一定存在且有值,结果本地测试发无slot请求时直接触发了TypeError。比如你要是写了const slotValue = event.currentIntent.slots.SomeSlot,当slots是空对象或者压根不存在时,肯定会报错。可以改成这样的容错写法:// 先确保slots存在,再安全取值 const slots = event.currentIntent.slots || {}; const targetSlot = slots.SomeSlot || '请补充相关信息';检查测试用例的意图匹配逻辑
确认你的单元测试里,用户输入how can I setup确实映射到了正确的intent,而且这个intent的配置是允许无slot就触发fulfillment的。有时候本地测试的意图匹配逻辑和Lex控制台的有差异,导致请求里的intent信息不对,自然就会报错。打出完整的TypeError栈信息
你贴的错误只显示了TypeError: ca...,建议把完整的错误栈打出来——比如在测试代码里加个错误捕获,或者调整测试框架的日志级别,这样能精准定位到哪一行代码出了问题,是访问了未定义的属性,还是函数调用参数不对,一目了然。
内容的提问来源于stack exchange,提问作者C A

