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

使用Firebase Shell本地单元测试DialogflowApp的问题

解决Firebase Shell测试Dialogflow云函数的请求构造问题

我之前也踩过这个坑!Firebase官方文档确实没详细讲Dialogflow触发的云函数怎么在Shell里测试,核心问题就是得构造完全符合Dialogflow API格式的请求对象,不然DialogflowApp根本识别不了。下面是我亲测有效的解决步骤:

1. 先确认Dialogflow API版本

Dialogflow v1和v2的请求结构差异很大,先搞清楚你的Agent用的是哪个版本:

  • v1版本的请求核心字段是result
  • v2版本的请求核心字段是queryResult

别搞混了,这是最容易出错的地方!

2. 构造正确的测试请求对象

根据你的API版本,构造对应的请求结构,下面给两个示例:

示例:Dialogflow v2请求

const testRequest = {
  // 必须有session字段,格式要和你的项目匹配
  session: "projects/你的Firebase项目ID/agent/sessions/test-session-001",
  queryResult: {
    // 对应你在Dialogflow里定义的意图名称
    intent: { displayName: "查询天气" },
    // 意图里的参数,键名要和Dialogflow里的完全一致(大小写敏感)
    parameters: { city: "上海", date: "2024-05-20" },
    // 用户的输入文本,可选但建议加上
    queryText: "上海明天天气怎么样?",
    // 如果需要测试上下文,加上这个字段
    outputContexts: [
      {
        name: "projects/你的项目ID/agent/sessions/test-session-001/contexts/weather-context",
        parameters: { city: "上海" },
        lifespanCount: 5
      }
    ]
  }
};

示例:Dialogflow v1请求

const testRequest = {
  sessionId: "test-session-001",
  result: {
    intentName: "查询天气",
    parameters: { city: "上海", date: "2024-05-20" },
    resolvedQuery: "上海明天天气怎么样?",
    // v1的上下文字段放在result里
    contexts: [
      { name: "weather-context", parameters: { city: "上海" }, lifespan: 5 }
    ]
  }
};

3. 在Firebase Shell里正确调用

方式一:直接在Shell里定义请求并调用

打开Firebase Shell后,先定义请求对象,再调用你的函数:

// 先粘贴上面的testRequest定义
const mockRes = {
  // 模拟响应对象,用来接收DialogflowApp返回的结果
  send: (data) => console.log("返回结果:", JSON.stringify(data, null, 2)),
  json: (data) => console.log("JSON返回结果:", JSON.stringify(data, null, 2))
};
// 调用你的云函数,把req和mockRes传进去
myFunction(testRequest, mockRes);

方式二:从文件导入请求对象

如果请求结构比较复杂,建议把它写到单独的测试文件里,比如test/dialogflow-test-request.js:

module.exports = {
  session: "projects/你的项目ID/agent/sessions/test-session-001",
  queryResult: {
    intent: { displayName: "查询天气" },
    parameters: { city: "上海", date: "2024-05-20" }
  }
};

然后在Firebase Shell里导入并调用:

const testReq = require("./test/dialogflow-test-request.js");
const mockRes = { send: (d) => console.log(d) };
myFunction(testReq, mockRes);

4. 常见坑点提醒

  • 参数名称必须完全匹配:Dialogflow里定义的参数是city就不能写成City,大小写敏感!
  • session格式要正确:v2的session字段必须包含项目ID和会话ID,格式错了会导致上下文等功能失效。
  • 模拟响应对象:DialogflowApp需要调用res.send()或res.json()返回结果,所以必须给一个带这些方法的mock对象,不然会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:21:28