Node.js 模仿路易斯的反应,路易斯认知器不工作

Node.js 模仿路易斯的反应,路易斯认知器不工作,node.js,botframework,azure-language-understanding,nock,Node.js,Botframework,Azure Language Understanding,Nock,我试图通过nock模拟对LUIS的呼叫,nock使用botbuilder ai中的LuisRecogner。以下是相关信息 机器人本身正在调用LUIS,并通过const recognizerResult=wait this.dispatchRecognizer.recognizecontext;获取结果;。我得到的实际结果如下: {"text":"I want to look up my order","intents":{"viewOrder":{"score":0.996454835},"s

我试图通过nock模拟对LUIS的呼叫,nock使用botbuilder ai中的LuisRecogner。以下是相关信息

机器人本身正在调用LUIS,并通过const recognizerResult=wait this.dispatchRecognizer.recognizecontext;获取结果;。我得到的实际结果如下:

{"text":"I want to look up my order","intents":{"viewOrder":{"score":0.996454835},"srStatus":{"score":0.0172454268},"expediteOrder":{"score":0.0108480565},"escalate":{"score":0.007967358},"qna":{"score":0.00694736559},"Utilities_Cancel":{"score":0.005627355},"manageProfile":{"score":0.004953466},"getPricing":{"score":0.001781322},"Utilities_Help":{"score":0.0007197641},"getAvailability":{"score":0.0005667514},"None":{"score":0.000321137835}},"entities":{"$instance":{}},"sentiment":{"label":"negative","score":0.171873689},"luisResult":{"query":"I want to look up my order","topScoringIntent":{"intent":"viewOrder","score":0.996454835},"intents":[{"intent":"viewOrder","score":0.996454835},{"intent":"srStatus","score":0.0172454268},{"intent":"expediteOrder","score":0.0108480565},{"intent":"escalate","score":0.007967358},{"intent":"qna","score":0.00694736559},{"intent":"Utilities.Cancel","score":0.005627355},{"intent":"manageProfile","score":0.004953466},{"intent":"getPricing","score":0.001781322},{"intent":"Utilities.Help","score":0.0007197641},{"intent":"getAvailability","score":0.0005667514},{"intent":"None","score":0.000321137835}],"entities":[],"sentimentAnalysis":{"label":"negative","score":0.171873689}}}
为了简洁起见,我将在下面的代码中调用此识别器结果。我正在使用nock成功拦截测试文件中的API调用,配置如下:

nock('https://westus.api.cognitive.microsoft.com')
.post(/.*/)
.reply(200,{recognizerResult});
我已经尝试以JSON对象和字符串的形式返回,尽管我几乎可以肯定这需要是JSON对象,如图所示,我正在用同样的方法模拟对QnA maker的调用。当我通过mocha运行此测试时,我得到以下错误:

TypeError: Cannot read property 'replace' of undefined
    at LuisRecognizerV2.normalizeName (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:96:21)
    at luisResult.intents.reduce (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:104:31)
    at Array.reduce (<anonymous>)
    at LuisRecognizerV2.getIntents (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:102:32)
    at LuisRecognizerV2.<anonymous> (node_modules\botbuilder-ai\src\luisRecognizerOptionsV2.ts:81:27)
    at Generator.next (<anonymous>)
    at fulfilled (node_modules\botbuilder-ai\lib\luisRecognizerOptionsV2.js:11:58)
    at process._tickCallback (internal/process/next_tick.js:68:7)
问题在于{recognizerResult}是保存到const recognizerResult的内容,而不是API调用返回的内容

要找到这一切需要大量的挖掘,但是v2luis客户端会得到API响应

您有几个选项可以修复此问题:

在const result=行上的节点\u modules\botbuilder ai\src\luisRecognizerOptionsV2文件中设置一个断点,并获取luisResult。 使用类似Fiddler的东西来记录实际的API响应并使用它 手动编写 作为参考,您可以在我们的测试中看到我们是如何做到这一点的:

你可以看到我们的nock,这就是为什么会抛出错误

具体来说,模拟响应只需要是v2/luisResults属性。换句话说,当使用LuisRecogener时,nock中设置的响应需要

.reply200,{query:Sample query,topscoringcontent:{intent:desiredIntent,score:1},entities:[]}


如果查看上面链接的测试数据,实际响应中还有其他属性。但是,如果您只是试图让topIntent测试路由,那么这是所需的最低响应。如果您需要其他属性,您可以添加它们,例如,您可以添加v2中的所有内容,如中的内容,或者添加一些更复杂的文件,如多个意图。

我根据示例使用v2属性更新了响应,但我继续得到相同的错误。由于某种原因,我目前无法运行调试器来解决这个问题。我也只是在LuisReconceptionsV2文件中放了一个console.log语句,但也没有显示任何内容。“我也没有看到Fiddler中的软件包。”billoverton很有趣。介意分享你的代码吗?可能会使我更快/更容易帮助调试。vDASHmicricATmicrosoftDOTcom将所有大写字母替换为字符。可能需要更改post路径以匹配我们的?那会让我有点吃惊,但我到目前为止还没有什么东西向我冲过来,我明白了。我没有意识到我需要的是提供v2属性作为响应,而不是作为响应的一部分。其他结果由模块添加。换句话说,我在nock中的响应需要是.reply200,{query:Sample query,topScoringIntent:{intent:viewOrder,score:0.991234567},entities:[]};我现在已经开始工作了,我会接受你的回答,但是在里面明确说明nock的反应应该是什么样子可能会有好处。@billoverton我想我明白你的意思了。您是否能够编辑我的答案以更好地匹配所需内容?补充。一旦is出现,请查看并确保您同意我的发现。
nock('https://myqnaservicename.azurewebsites.net')
.post(/.*/)
.reply(200, {"answers": [{"questions": ["I need an unrecognized utterance for testing"], "answer": "I can hear you now!", "score": 28.48, "id": 1234}]});