Realtime Database エミュレータは、データベースのセキュリティ ルールの動作を確認する単体テストを簡単に作成できるようにします。
本番環境データベースの代わりにこのローカル エミュレータに対してアプリケーション全体を実行することは原理上可能ですが、いくつか問題が発生することがあります。特に、Firebase Auth との統合が機能しません。Google ではこの事象の改善に取り組んでおりますので、当面は、セキュリティ ルールが想定どおりに動作することを確認するためのテストをいくつか作成してみてください。
エミュレータが起動すると、データベースはセキュリティの観点から「ロックダウン」されます(".read" と ".write" が両方とも false になります)。書き込みを行うには、事前にセキュリティ ルールを設定する必要があります。設定は、SDK のテスト モジュールを使用して単体テスト フレームワーク内から直接行うことができます(以下を参照)。
フィードバックにご協力をお願いいたします。ご意見、ご感想がありましたら、ぜひ Google までお寄せください。
エミュレータと本番環境の違い
- データベース インスタンスを明示的に作成する必要がありません。エミュレータは、アクセスされるデータベース インスタンスを自動的に作成します。
- 新しいデータベースは閉じられたルールで起動されるため、管理者以外のユーザーは読み書きできません。
- エミュレートされた各データベースには、Spark プランの制限と割り当てが適用されます(特に重要なのは、これにより各インスタンスの同時接続数が 100 に制限されることです)。
- どのデータベースも、文字列
"owner"を管理者認証トークンとして受け入れます。- REST API を管理者として使用する場合は、以下のヘッダーを含めます。
Authorization: Bearer owner - このトークンは、curl を使用してルールを設定するのに使用できます。たとえば、ルールが database.rules.json ファイルにある場合は、以下のようになります。
curl -X PUT -H 'Authorization: Bearer owner' --data @database.rules.json http://localhost:9000/.settings/rules.json?ns=<name>
- REST API を管理者として使用する場合は、以下のヘッダーを含めます。
- このデータベース エミュレータは、他の Firebase プロダクトと動的なやり取りを行いません。特に、通常の Firebase 認証フローは機能しません。その代わりに、テスト モジュールの中に
authフィールドを受け取るinitializeTestApp()メソッドを用意しました。このメソッドを使用して作成された Firebase ハンドルは、どのようなエンティティを指定しても正常に認証されたかのように動作します。nullを渡すと、認証されていないユーザーとして動作します(たとえば、auth != nullルールが失敗します)。
エミュレータをインストールする
Realtime Database エミュレータをインストールするには、Firebase CLI を使用し、次の手順に沿って操作します。
- 次のコマンドを使用して Realtime Database エミュレータをインストールします。
firebase setup:emulators:database - 次のコマンドを使用してエミュレータを起動します。すべてのテストでエミュレータが実行されます。
firebase serve --only database注: Realtime Database エミュレータには Java 8 以降が必要です。
エミュレータとのやり取り
通常の Firebase Realtime Database インスタンスは、firebaseio.com のサブドメインからアクセスできるため、次の方法で REST API にアクセスできます。
https://<database_name>.firebaseio.com/path/to/my/data.json
エミュレータはローカルで実行され、localhost:9000 でアクセスできます。特定のデータベース インスタンスと対話するには、クエリ パラメータを使用してデータベース名を指定する必要があります。
http://localhost:9000/path/to/my/data.json?ns=<database_name>
Firebase SDK を使用したエミュレータとのやり取りを容易にするために、@firebase/testing モジュールを用意しています。@firebase/testing モジュールを使用すると、ローカルで実行中の Realtime Database エミュレータとやり取りできます。タイムアウトまたは ECONNREFUSED のエラーが発生する場合は、エミュレータが実行されていることを確認してください。
async/await の表記法を使用できるようにするため、新しいバージョンの Node.js を使用することを強くおすすめします。テスト対象となる可能性のある動作のほとんどには非同期関数があります。また、テスト モジュールは Promise ベースのコードで動作するように設計されています。
公開されているモジュールのメソッドは以下のとおりです。
initializeTestApp({ databaseName:
このメソッドを使用すると、テストで使用するための、特定のユーザーとして認証されたアプリを作成できます。
オプションで指定されたデータベース名と auth 変数のオーバーライドに対応する、初期化された Firebase アプリを返します。リモート サーバーに対して実行されるものではないため、databaseURL を使用しない点に注意してください。
firebase.initializeTestApp({
databaseName: "my-database",
auth: { uid: "alice" }
});
initializeAdminApp({ databaseName:
このメソッドを使用すると、テストの状態を設定するための、管理者として認証されたアプリを作成できます。
オプションで指定されたデータベース名に対応する初期化された Firebase 管理アプリを返します。このアプリは、データベースに対する読み書きを行う際にセキュリティ ルールを迂回します。
firebase.initializeAdminApp({ databaseName: "my-database" });
loadDatabaseRules({ databaseName:
このメソッドを使用すると、データベースのルールを設定できます。
ローカルで実行されているデータベースにルールを送信します。データベースは、"databaseName"と "rules" を文字列で指定したオプション オブジェクトを受け取ります。
firebase
.loadDatabaseRules({
databaseName: "my-database",
rules: "{'rules': {'.read': false, '.write': false}}"
});
apps() => [FirebaseApp]
現在初期化されているテストと管理アプリをすべて返します。
このメソッドは、テスト中またはテスト後にアプリを消去するのに使用できます(アクティブなリスナーを持つ初期化されたアプリは JavaScript の終了を妨げるため、注意してください)。
Promise.all(firebase.apps().map(app => app.delete()))
assertFails(pr: Promise) => Promise
入力が成功した場合は拒否され、入力が拒否された場合は成功する Promise を返します。
このメソッドを以下のように使用して、データベースの読み取りまたは書き込みに失敗したことをアサートします。
firebase.assertFails(app.database().ref("secret").once("value"));
assertSucceeds(pr: Promise) => Promise
入力が成功した場合は成功し、入力が拒否された場合は拒否される Promise を返します。
このメソッドを以下のように使用して、データベースの読み取りまたは書き込みが成功したことをアサートします。
firebase.assertSucceeds(app.database().ref("public").once("value"));
テストレポートを生成する
一連のテストを実行した後、それぞれのセキュリティ ルールの評価を示したテスト カバレッジ レポートにアクセスできます。レポートを取得するには、エミュレータの実行中に公開されたエンドポイントに対してクエリを実行します。ブラウザでの表示に適したバージョンを参照するには、次の URL を使用します。
http://localhost:9000/.inspect/coverage?ns=<database_name>
これによりルールが式やサブ式に分割されます。それぞれの式の上にマウスカーソルを重ねて、実行回数や返された値などの詳細情報を確認できます。このデータの未加工の JSON バージョンを取得するには、クエリに次の URL を含めます。
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
クイックスタート
最小限のサンプルを動かしたい場合は、JavaScript のクイックスタートをお試しください。

