Firebase Firestore の試験書くのに @firebase/testing
という npm パッケージがあるんだけど、どうやら先月2020年8月に deprecated になり新しい @firebase/rules-unit-testing
というものに置き換えられたようです。
エラー
さっそく手元のコードを置き換えたところ、同じコードでエラーになってしまいました。
こちらがコード。かつて @firebase/testing
利用の頃はそのまま動いてました。
import { initializeAdminApp } from "@firebase/rules-unit-testing"; import "babel-polyfill"; it("is ok", async () => { const admin = initializeAdminApp({ projectId: "my-project" }); try { const doc = admin.firestore().collection("items").doc("item-1"); await doc.set({ name: "Item 1" }); const ss = await doc.get(); expect(ss.data()?.name).toBe("Item 1"); } finally { await admin.delete(); } });
で、エラーです。
Cannot find module 'firebase-admin' from 'index.cjs.js'
3 |
4 | it("is ok", async () => {
> 5 | const admin = initializeAdminApp({ projectId: "my-project" });
| ^
firebase-admin
って何だよ index.cjs.js
ってどこだよ。
解決策
勘で試したところ firebase-admin
は npm パッケージで、それをインストールすれば解決しました。そっか。
$ npm install -D firebase-admin
クライアント側で使わないので dependencies じゃなくて devDependencies へインストールしておきます。
コードは変更なし
特に変えてないけどちゃんと動いてるっぽいです。
おしまい
node_modules/@firebase/rules-unit-testing/package.json
を開くと件の firebase-admin
は案の定 peerDependencies に含まれていました。
ずっとクライアント側の実装でばかり使っていたので firebase-admin
は使ったことがなく気付かなかったけど、思いついて良かった。
問題を整理すると解決に繋がることが多いですね。勘も必要だけども。
参考
- Cloud Firestore セキュリティ ルールをテストする | Firebase … 日本語版ではまだ古い
@firebase/testing
しか触れてない - @firebase/testing – npm
- @firebase/rules-unit-testing – npm
- firebase-admin – npm