Я пытаюсь написать модульные тесты для пользовательского хука 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, который не очень хорошо работает с фиктивными функциями.