Firebase Cloud Functionsをローカルでテストする

Firebase の Cloud Functions をローカルでテストするための手順です。
Cloud Functions は非常に簡単にデプロイできますが、ローカルで実際にテストする環境を構築することも簡単にできます。
前提
Node.js
Firebase SDK
Firebase SDK が入っていない場合は以下のコマンドで SDK を入れます。
$ npm install -g firebase-tools
プロジェクトを初期化したら functions ディレクトリでfirebase-functions
とfirebase-admin
を入れます。
$ npm install -s firebase-functions@latest firebase-admin
プロジェクトをエイリアスに追加しておくとデフォルトで読み込まれるので、いちいちプロジェクト ID を入れずにすみます。
$ firebase use --add? Which project do you want to add?> プロジェクト ID を選択? What alias do you want to use for this project? (e.g. staging)> エイリアスを入力
関数テスト
ローカルでテストをするにあたって提供されているインターフェイスは URL と対話型の二種類があります。
URL 提供型
基本的にはdeploy
をserve
に変えるだけです。コマンドを実行してビルドが成功するとlocalhost
で始まる URL が表示されます。
# 関数のみの場合$ firebase serve --only functions# Firebase Hosting を利用している場合$ firebase serve
対話型シェル
対話型のシェルの方が直感的でオススメです。
$ firebase functions:shell
関数の実行は、export
している関数名をそのまま呼び出します。例えば、helloWorld
という名前の関数がある場合、以下の様に実行できます。
firebase > helloWorld()
もし http のメソッドでトリガーする内容を分けているのであれば、以下の様にコールします。引数にサブパスを渡すこともできます。
firebase> helloHttps()firebase> helloHttps.get()firebase> helloHttps.post('path')
Database のイベントで発火するファンクションを実行するには、引数にデータを渡します。Firestore は key-value のオブジェクトになります。
# RealtimeDatabasefirebase> myRealtimeDBFunction('data')# アップデートか書き込みの場合firebase> myRealtimeDBFunction({before: 'old_data', after: 'new_data' })# Firestorefirebase> myFirestoreFunction({foo: 'data'})
データベース接続
ここで注意しなければいけないのは、関数自体はローカルに存在しているのですが、データベースは実際に Firebase プロジェクトのものを参照しに行っているので、完全にローカルではないということです。
完全にオフラインのテストは、単体テストで行うことができますが、こちらでも紹介されている通りデータのスタブが大量になるため、かなり大変になります。やり方はオフィシャルのドキュメントに書いてありますので興味があればどうぞ。