Ошибка типа: firebase.analytics не является функцией при издевательстве с помощью jest

#javascript #reactjs #firebase #testing #jestjs

#javascript #reactjs #firebase #тестирование #jestjs

Вопрос:

Я начинаю использовать Jest для тестирования моего приложения React, я пишу базовый тест, и у меня есть исключение. Тестовый код следующий

 // __test__/App.test.js
import '@babel/polyfill'
import React from 'react';
import App from '../components/App'
import { render } from '@testing-library/react';

jest.mock('firebase/app')
// The error is the same with or without the following line:
firebase.analytics.mockResolvedValue(null)

it("renders without crashing", () => {
  render(<App />);
});

  

Но когда я запускаю npx jest , я получаю этот вывод:

  FAIL  src/__test__/App.test.jsTest suite failed to run

    TypeError: firebase.analytics is not a function

       8 | // Initialize Firebase
       9 | firebase.initializeApp(firebaseConfig);
    > 10 | firebase.analytics();
         |          ^
      11 | 
      12 | const db = firebase.firestore();
      13 | 
  

Приложение работает так, как должно, вне тестов.

Как я могу сделать, чтобы корректно издеваться над firebase, чтобы просто протестировать, чем приложение отображает без ошибок?

Ответ №1:

Если кому-то интересно: я нашел способ сделать это. Я издеваюсь над функциями, которые я использую:

 // __mocks__/firebase/app.js

module.exports = (function () {
  const _tareas = { ...initialData }
  return {
    initializeApp: () => null,
    analytics: () => null,
    firestore: () => ({
      collection: () => ({
        get: () => ({
          docs: _tareas.list.map(index => ({
            data: () => _tareas.byId[index],
            id: index,
          }))
        }),
        add: (tarea) => {
          const newIndex = _tareas.list.length
          _tareas.list.push(newIndex)
          _tareas.byId[newIndex] = tarea
        },
      })
    }),
  }
})()

  

Мне также пришлось создавать пустые файлы __mocks__/firebase/analytics и __mocks__/firebase/firestore

Я собираюсь реализовать функции по мере необходимости

Теперь это работает так, как я ожидаю