LoginSignup
10
4

More than 3 years have passed since last update.

Firebase SDKをJestでMockしてテストする

Last updated at Posted at 2020-07-09

やりたいこと

Firebase SDKを利用した関数のテストをしたいと思い立ちました。実際にAPIにアクセスせずにテストを実行したいので、Firebase SDKをMockしてテストを行うこととしました。テストはJestを使います。

テスト対象のコード

例としてCloud Firestoreを利用する際の手順を記載します。
なお、以下には記載していませんが、環境構築は終わっているものとすします。(手順はこちらの通り!)

以下のようなFirestoreのドキュメントを監視して更新があったときにsomethingをする関数をテストすることにしてみます。

target.js

  async watchDoc({ commit }) {
    await firebase
      .firestore()
      .collection('users')
      .onSnapshot((snapshot) => {
        snapshot.forEach((doc) => {
          doSomething(doc)
        })
      })
  }

Colud Firestoreは以下のように初期化されていることとします。

initFirebase.js

import firebase from 'firebase'

// Initialize Cloud Firestore through Firebase
firebase.initializeApp({
  apiKey: process.env.API_KEY,
  authDomain: process.env.AUTH_DOMAIN,
  databaseURL: process.env.DATABASE_URL,
  projectId: process.env.PROJECT_ID,
  storageBucket: process.env.STORAGE_BUCKET,
  messagingSenderId: process.env.MESSAGING_SENDER_ID
});

export default firebase

テストコード

以下のようにMockを作成し、振る舞いを定義することで、実際にAPIを叩かずにdoSomething関数を動作させてテストを行うことができます。

firestore.spec.js

import * as firebase from 'initFirebase'
import * as firestore from 'target.js'

// firebase.firestore()のMockを作成する
jest.mock('initFirebase', () => ({
  firestore: jest.fn()
}))

// firebase.firestore()の振る舞いを定義する
const firebaseMock = firebase.firestore.mockImplementation(() => {
     return {
        collection: jest.fn(() => ({
          onSnapshot: jest.fn((func) => {
            func(doc) // docにはAPIから返ってくるDocument相当のデータを入れる
          })
        }))
      }
   })

// テストを記述していく

Mock方法のみ記載しています。テスト部分ややFirestoreの構築方法などは別の記事などを参考にしてください。。

10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4