概要
Cloud Functions for Firebase (以下 functions) の関数をオフラインで単体テストします。
※ functions の関数のテストはどちらかというとシステムテストっぽくなりがちですが、公式に従って単体テストと呼称します。
↑公式ドキュメントによると、関数をテストするためにはオンラインモードとオフラインモードの2種類を選択することができます。
さらに、オンラインモードの場合はテスト用のプロジェクトを使って動かすか、Firebase Local Emulator Suite に接続して動かすかを選択することになります。
公式にはオンラインでのテストが推奨されています。
Cloud Firestore または Realtime Database の関数を使用している場合は、テストコードが非常に複雑になるため、オフライン モードの使用は通常おすすめしません。
しかし、Firebase 以外の外部サービスと通信が関数内で発生する場合、それらのモックを作るのが難しくなるので、できれば関数単体でのテストも選択肢に入れられると良さそうです。
Express のテストフレームワークである supertest を使ってテストを簡単に書くことができそうなので、書いてみます。
テスト対象のコード
まずはモックが不要な、非常にシンプルな関数 ok()
に対してテストを書いてみます。
import * as functions from "firebase-functions";
export const ok = functions
.https
.onRequest((request, response) => {
response.sendStatus(200);
});
テストコード
Jest を想定して書いていますが、他のテストフレームワークでも assertion は大体同じように書けます。
import * as express from "express"; // (1)
import * as supertest from "supertest"; // (1)
import {ok} from "../ok";
describe(storeSomething, () => {
const app = express(); // (2)
beforeAll(() => {
app.use(ok); // (2)
});
it("returns 200 OK", async () => {
await supertest(app) // (3)
.get("/ok")
.expect(200);
});
});
まず (1)
で express
と supertest
をインポートしておきます。
(2)
で express
を初期化し、関数 ok()
を router に登録します。
あとは supertest
で通常の Express app をテストするときのようにテストコードを書けば OK です。