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