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

Firebase Logo

Firebase の Cloud Functions をローカルでテストするための手順です。

Cloud Functions は非常に簡単にデプロイできますが、ローカルで実際にテストする環境を構築することも簡単にできます。

前提

Node.js

Firebase SDK

Firebase SDK が入っていない場合は以下のコマンドで SDK を入れます。

$ npm install -g firebase-tools

プロジェクトを初期化したら functions ディレクトリでfirebase-functionsfirebase-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 提供型

基本的にはdeployserveに変えるだけです。コマンドを実行してビルドが成功すると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 のオブジェクトになります。

# Realtime
Databasefirebase> myRealtimeDBFunction('data')
# アップデートか書き込みの場合
firebase> myRealtimeDBFunction({before: 'old_data', after: 'new_data' })
# Firestore
firebase> myFirestoreFunction({foo: 'data'})

データベース接続

ここで注意しなければいけないのは、関数自体はローカルに存在しているのですが、データベースは実際に Firebase プロジェクトのものを参照しに行っているので、完全にローカルではないということです。

完全にオフラインのテストは、単体テストで行うことができますが、こちらでも紹介されている通りデータのスタブが大量になるため、かなり大変になります。やり方はオフィシャルのドキュメントに書いてありますので興味があればどうぞ。

参考

COPYRIGHT © 2023 Kohei Ando