Изменение шутливого макета на конкретный c тест - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь написать модульные тесты для пользовательского хука React, который подключается к Firebase. Поскольку я не хочу подключаться к Firebase при выполнении моих тестов, я издевался над Firebase и Firebase / app. Это очень простые макеты, возвращающие только те функции, которые фактически использует код.

// __mocks__/firebase.js
export default {
  analytics: jest.fn(),
  storage: jest.fn()
};
// __mocks__/firebase/app.js
const auth = jest.fn().mockReturnValue({
  currentUser: {
    getIdTokenResult: jest.fn().mockReturnValue({
      claims: jest.fn()
    })
  },
  onIdTokenChanged: jest.fn()
});

export default {
  initializeApp: jest.fn(),
  auth
}

Это отлично работает для некоторых моих тестов, но в некоторых случаях мне нужно изменить значения в макете файла , В конкретном случае c я хочу убедиться, что ошибки обнаруживаются, если что-то пойдет не так с Firebase, поэтому я хочу сделать значение currentUser равным false (что заставляет мой хук выдавать ошибку, поэтому я может проверить это.

Однако я не могу понять, как изменить проверенный файл для одного указанного c теста, оставив его таким же для других тестов.

Вот пример моего тестового файла

import { renderHook, cleanup } from '@testing-library/react-hooks';
import useFirebase from 'src/App/useFirebase';

/*
 * For some reason, jest.mock('firebase') doesnt use my custom mock files,
 * so I have to explicitly tell jest which files to use
 */
jest.mock('firebase', () => jest.requireActual('../../../__mocks__/firebase'));
jest.mock('firebase/app', () => jest.requireActual('../../../__mocks__/firebase/app'));

afterEach(cleanup);

test('returns rejected promise if theres an error', async () => {

  // Trying to override the mocked module, with a slightly different one.
  // However, useFirebase.js still uses the first mocked module
  jest.mock('firebase/app', () => ({
    auth: jest.fn().mockReturnValue({
      currentUser: false
    }),
    initializeApp: jest.fn()
  }));

  expect.assertions(1);
  const { result } = renderHook(() => useFirebase());

  // verifyGroup is a function in useFirebase(), that I'm trying to make return
  // a rejected promise
  await result.current.verifyGroup()
    .catch(e => {
      expect(e).not.toBeNull();
    });
});

Ничто из того, что я делаю, не заставляет useFirebase.js использовать мой второй макет вместо моего первого.

Как мне этого добиться?

Редактировать: я считаю, что часть проблемы заключается в том, что я использую импорт ES6, который не очень хорошо работает с фиктивными функциями.

...