【问题标题】:Test Firebase RealtimeDatabase using Jest使用 Jest 测试 Firebase 实时数据库
【发布时间】:2019-04-13 19:25:37
【问题描述】:

我的目的只是测试一个功能。我无法弄清楚如何正确模拟 firebase。我尝试使用来自 Jest 文档的 axios 模拟来保留示例。我有以下代码:

MusicService.js

import { initializeApp } from "firebase/app";
import "firebase/database";

const firebase = initializeApp({
  apiKey: "<API_KEY>",
  authDomain: "<PROJECT_ID>.firebaseapp.com",
  databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
  projectId: "<PROJECT_ID>",
  storageBucket: "<BUCKET>.appspot.com",
  messagingSenderId: "<SENDER_ID>",
});

export class MusicService {
  static getAlbums() {
    return firebase.database().ref("albums").once("value")
    .then(snapshot => Object.values(snapshot.val()));
  }
}

MusicService.test.js

import firebase from 'firebase/app';
import 'firebase/database';
import { MusicService } from './MusicService';

jest.mock('firebase/app');
jest.mock('firebase/database');

test("test", () => {
  firebase.initializeApp.mockImplementation(() => {
    database: jest.fn(() => {
      return {
        ref: jest.fn()
      }
    })
  });

  MusicService.getAlbums();
});

问题是我收到以下错误:

我试图模拟 firebase.database。

test("test", () => {
  firebase.mockImplementation(() => {
    return {
      database: {

      }
    }
  });
  MusicService.getAlbums();
});

但在这种情况下,我收到错误消息:

TypeError: _app.default.mockImplementation 不是函数。

我不希望给出有效的示例,但您能告诉我,我究竟应该模拟什么?整个 firebase 库或者我的函数开始的部分 - return firebase.database()

【问题讨论】:

    标签: javascript firebase unit-testing firebase-realtime-database jestjs


    【解决方案1】:

    我想通了。我应该只模拟那些模块,一个我要测试的函数,取决于。比如我想测试getAlbums函数。它使用从MusicService.js 中的firebase/app 模块导入的initializeApp 函数。因此,当调用initializeApp 函数时,它应该返回一个包含database 函数的对象,该对象又返回一个具有refonce 函数的对象。代码:

    MusicService.test.js

    import { MusicService } from "./FirebaseService";
    
    jest.mock("firebase/app", () => {
      const data = { name: "unnamed" };
      const snapshot = { val: () => data };
      return {
        initializeApp: jest.fn().mockReturnValue({
          database: jest.fn().mockReturnValue({
            ref: jest.fn().mockReturnThis(),
            once: jest.fn(() => Promise.resolve(snapshot))
          })
        })
      };
    });
    
    test("getAlbums function returns an array", async () => {
      const data = await MusicService.getAlbums();
      expect(data.constructor).toEqual(Array);
    });
    

    【讨论】:

      【解决方案2】:

      这是我目前对 firebase.js 的模拟实现。 对我来说它工作正常。

      const firebase = jest.genMockFromModule('firebase');
      
      firebase.initializeApp = jest.fn();
      
      const data = { name: 'data' };
      const snapshot = { val: () => data, exportVal: () => data, exists: jest.fn(() => true) };
      
      firebase.database = jest.fn().mockReturnValue({
        ref: jest.fn().mockReturnThis(),
        on: jest.fn((eventType, callback) => callback(snapshot)),
        update: jest.fn(() => Promise.resolve(snapshot)),
        remove: jest.fn(() => Promise.resolve()),
        once: jest.fn(() => Promise.resolve(snapshot)),
      });
      
      firebase.auth = jest.fn().mockReturnValue({
        currentUser: true,
        signOut() {
          return Promise.resolve();
        },
        signInWithEmailAndPassword(email, password) {
          return new Promise((resolve, reject) => {
            if (password === 'sign' || password === 'key') {
              resolve({ name: 'user' });
            }
            reject(Error('sign in error '));
          });
        },
        createUserWithEmailAndPassword(email, password) {
          return new Promise((resolve, reject) => {
            if (password === 'create' || password === 'key') {
              resolve({ name: 'createUser' });
            }
            reject(Error('create user error '));
          });
        },
      });
      
      export default firebase;
      

      【讨论】:

      • 似乎 ref 现在获取了一个参数,所以我收到此错误ref is not a function
      猜你喜欢
      • 2020-10-17
      • 2021-05-27
      • 2020-06-14
      • 2017-09-03
      • 2019-03-04
      • 1970-01-01
      • 2021-12-09
      • 2018-09-07
      • 2018-07-04
      相关资源
      最近更新 更多