单独测试Google Dialogflow上的操作

时间:2018-02-14 15:57:11

标签: firebase google-cloud-functions chatbot actions-on-google dialogflow

我尝试使用firebase shell环境在本地对DialogflowApp进行单元测试。 (在cli做firebase实验:函数:shell然后调用我的方法)

我已按照谷歌https://firebase.google.com/docs/functions/local-emulator的指南进行操作,但他们没有使用DialogflowApp,其中被调用的函数尝试绑定包含意图和参数的请求对象,如下所示 - >

exports.myFunction = functions.https.onRequest((request, response) => {
const app = new App({ request, response });

function myMethod(app) {
    let myArgument = app.getArgument(MY_ARGUMENT);
    app.tell('Here we are responding');
}

let actionMap = new Map();
actionMap.set(MYMETHOD_ACTION, myMethod);

app.handleRequest(actionMap);
});

无论我在CLI中发送哪个请求对象,如myFunction(require("../test/testdata.json")),请求正文对象都是空的,就像这个body: {}一样,这意味着我无法app.handleRequest()app.getArgument()。我得到的错误信息是

  

从功能收到的响应:400,操作错误:没有匹配的意图   处理程序:null

我认为如果我使用Google上的操作中显示的json请求数据填充testdata.json - > console.actions.google.com - >模拟器它将是有效的数据,但没有。

我的问题是,如何模拟我的请求数据,以便我可以在本地开始单元测试我的完整填充方法?

编辑1:

firebase > myMethod.post("/").form(require("../test/testdata.json"))
Sent request to function.
firebase > info: User function triggered, starting execution
info: Function crashed
info: TypeError: Cannot destructure property `parameters` of 'undefined' or 'null'.

如果我们查看dialogflow_app.js,我们可以看到此代码用于获取参数值

  getArgument (argName) {
    debug('getArgument: argName=%s', argName);
    if (!argName) {
      error('Invalid argument name');
      return null;
    }
    const { parameters } = this.body_.result;
    if (parameters && parameters[argName]) {
      return parameters[argName];
    }
    return this.getArgumentCommon(argName);
  }

this.body_总是空的{},无论我在本地运行时如何以及如何发送到方法中。

编辑3

firebase > myMethod({method: "post",json: true, body:  require("../test/testdata.json")})

已发送请求功能。 firebase> info:触发用户功能,开始执行 信息:功能崩溃 info:TypeError:无法解析' undefined'的属性parameters或者' null'。

1 个答案:

答案 0 :(得分:4)

使用shell调用Firebase HTTPS功能需要different form。它接受请求模块所做的参数,因此为了模拟webhook,它将是这样的:

myfunction({
  method: 'POST',
  json: true,
  body: require("../test/testdata.json")
});

这三个参数很重要:

  • 您需要指定这是一个POST操作
  • 你需要表明身体是JSON。这将发送正确的标题,并且不会尝试将正文发送为x-www-form-urlencoded
  • 你需要包括身体。由于您已将json参数设置为true,因此对象没问题。