posted: 2019/06/26

FirebaseにアップされたDialogflowのFulfillmentをUnit Testする

Dialogflowで利用するfirebase functionの関数をテストしたくで調べた。

準備編

こんな感じでまず関数を準備する

const functions = require("firebase-functions")
const { WebhookClient } = require("dialogflow-fulfillment")

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(
  (request, response) => {
    const agent = new WebhookClient({ request, response })
    const intentMap = new Map()
    function hello(agent) {
      const { name } = agent.parameters
      agent.add(`ハロー! ${name}`)
    }

    intentMap.set("hello", hello)
    agent.handleRequest(intentMap)
  }
)

テストを書く

こんな感じで素直にテストを書く。
firebase-functions-testは使えないので、素直にreqとreqを偽造して渡す。https://firebase.google.com/docs/functions/unit-testing?hl=ja

もうちょっと丁寧にやるならnode-mocks-httpを使う手もあったが、今回はそこまでやらなかった。

const assert = require("assert")
const { dialogflowFirebaseFulfillment } = require("../simple.js")

describe("function", () => {
  it("janken", (done) => {
    const req = {
      body: {
        queryResult: {
          queryText: "ハロー",
          parameters: {
            name: "太郎"
          },
          intent: {
            displayName: "hello"
          }
        }
      }
    }

    const res = {
      json: (j) => {
        console.log(j)
        const expect = { fulfillmentText: "ハロー! 太郎", outputContexts: [] }
        assert.deepEqual(expect, j)
        done()
      }
    }

    dialogflowFirebaseFulfillment(req, res)
  })
})

Requestをどう組み立てるか?

ちなみに、気づきづらいが、右サイドで入力テストが出来る。

そして「DIAGNOSTIC INFO」をクリックし、「FULLFILMENT REQUEST」のタブを開くと、RequestとしてAPIに入ってくるjsonが取得出来るので、これを元にデータをつくると良い