0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

supertest で Cloud Functions for Firebase のオフライン単体テストを書く

Last updated at Posted at 2023-07-02

概要

Cloud Functions for Firebase (以下 functions) の関数をオフラインで単体テストします。

※ functions の関数のテストはどちらかというとシステムテストっぽくなりがちですが、公式に従って単体テストと呼称します。

↑公式ドキュメントによると、関数をテストするためにはオンラインモードとオフラインモードの2種類を選択することができます。
さらに、オンラインモードの場合はテスト用のプロジェクトを使って動かすか、Firebase Local Emulator Suite に接続して動かすかを選択することになります。

公式にはオンラインでのテストが推奨されています。

Cloud Firestore または Realtime Database の関数を使用している場合は、テストコードが非常に複雑になるため、オフライン モードの使用は通常おすすめしません。

しかし、Firebase 以外の外部サービスと通信が関数内で発生する場合、それらのモックを作るのが難しくなるので、できれば関数単体でのテストも選択肢に入れられると良さそうです。

Express のテストフレームワークである supertest を使ってテストを簡単に書くことができそうなので、書いてみます。

テスト対象のコード

まずはモックが不要な、非常にシンプルな関数 ok() に対してテストを書いてみます。

functions/ok.ts
import * as functions from "firebase-functions";

export const ok = functions
  .https
  .onRequest((request, response) => {
    response.sendStatus(200);
  });

テストコード

Jest を想定して書いていますが、他のテストフレームワークでも assertion は大体同じように書けます。

functions/__tests__/ok.test.ts
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)expresssupertest をインポートしておきます。

(2)express を初期化し、関数 ok() を router に登録します。

あとは supertest で通常の Express app をテストするときのようにテストコードを書けば OK です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?