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 は使ったことがなく気付かなかったけど、思いついて良かった。

問題を整理すると解決に繋がることが多いですね。勘も必要だけども。

参考