firestoreを使ったコードのユニットテストをする
2024/03/09 荒井 雄治朗
初期費用は安いしスケールもしやすいので僕はよくFirestoreを使っている。
プログラムの中のデータベースの部分はモックにしないでなるべくデータを実際にデータベースに入れてテストをしたいと思っているが、firestoreだとなかなかうまくいかなかったので今の実際にやっている方法をメモする。
前提
テストの設定は以下の環境で行なっている。
システムはNext.js + Typescriptで作っている。テストの実行にはvitestを使っていて、テストをはfirebase-adminでサーバーサイドのコードのみをテストしている。
データベースはFirebase ローカル エミュレータ スイートを使ってローカルで実行している。
サーバーサイドのみテストをしているのは、クライアントサイドのコードをテストしようとしてもうまくFirebase ローカル エミュレータ スイートに接続できなかったから諦めたから。
vitestの設定
vitest.config.ts
setup.ts を読み込むように設定する。
setup.ts
テストの実行前にinitializeAppを実行するように設定する。
.env.testing
firebase ローカル エミュレータ スイートを使うための設定をする。
firebase-adminsdk.json
firebase-adminsdk.json はFirebaseのプロジェクトの設定からサービスアカウントのキーをダウンロードして作成する。
project_idはFIREBASE_PROJECT_IDに設定したプロジェクトIDと合わせる。
テストの実行前にデータを削除する
lib/firebaseTest.ts
テスト実行毎にデータを削除する beforeEachCleanFirestore を定義する。
このURLにDELETEリクエストを送ることでfirestoreのデータを削除できる。
テスト間でデータベースをクリアする
テストの実行
package.json
package.json にテストのスクリプトを設定して実行する。
並行実行すると他のテストと競合してエラーが発生するので、--no-file-parallelismを設定している。
テスト
設定をした上で、以下のようにテストを書くとエミュレータにアクセスしてテストを実行できる。