Протестируйте Firebase RealtimeDatabase с помощью Jest - PullRequest
0 голосов
/ 10 ноября 2018

Моя цель - просто проверить одну функцию.Я не могу понять, как правильно издеваться над огнем.Я пытаюсь привести пример с оскорблениями из Jest Docs.У меня есть следующий код:

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();
});

Проблема в том, что я получаю следующую ошибку: enter image description here

Я пытался смоделировать firebase.database.

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

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

Но в этом случае я получаю ошибкуэто говорит:

TypeError: _app.default.mockImplementation не является функцией.

Я не ожидаю, что будет приведен рабочий пример, но вы могли бы сказать,пожалуйста, что именно я должен издеваться?Вся библиотека Firebase или, возможно, часть, где начинается моя функция - return firebase.database().

Ответы [ 2 ]

0 голосов
/ 28 января 2019

это моя текущая фиктивная реализация для 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;
0 голосов
/ 17 ноября 2018

Я разобрался. Я должен издеваться только над теми модулями, от которых зависит функция, которую я собираюсь протестировать. Например, я хочу проверить функцию getAlbums. Он использует функцию initializeApp, которая импортируется из модуля firebase/app в MusicService.js. Поэтому, когда вызывается функция initializeApp, она должна возвращать объект, содержащий функцию database, которая, в свою очередь, возвращает объект с функциями ref и once. Код:

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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...