Как переопределить пользовательскую ложную реализацию модуля firebase?
Я пытаюсь протестировать вход в firebase через провайдера электронной почты, поэтому мне нужно покрыть случаи успеха и ошибок. Вопрос в том, что я имитирую метод firebase signInWithEmailAndPassword и возвращаю разрешенное Promise для случая успеха, но мне нужно заменить эту реализацию и вернуть Promise отклонения, чтобы покрыть случай ошибки, но я не знаю как.
Следуйте моему коду:
Создатель действия - войдите через электронную почту и пароль
user.js
import statusMessage from './status'
import { USER_LOGIN } from './types'
import firebase from '../lib/firebase';
export const signInViaEmailProvider = (data) => (dispatch) => {
const { email, password } = data
return new Promise(async (resolve, reject) => {
await statusMessage(dispatch, 'loading', true);
try {
let result = await firebase.auth().signInWithEmailAndPassword(email, password)
resolve(
dispatch({type: USER_LOGIN, payload: {email: email}})
)
await statusMessage(dispatch, 'loading', false);
} catch(err) {
reject({message: 'Error login via email'})
}
}).catch(async (err) => {
statusMessage(dispatch, 'error', err.message);
throw err.message;
})
}
пользовательский test.js
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)
import * as userActions from '../user'
import { USER_LOGIN, USER_ERROR, STATUS_REPLACE } from '../types'
jest.mock('../../lib/firebase', () => ({
auth: () => ({
signInWithEmailAndPassword: () => Promise.resolve({foo: 'bar'})
})
}))
describe('#user', () => {
let store
const user = {email: 'foo@bar.com', password: '123456'}
beforeEach(() => {
store = mockStore({})
})
it('should do login via email and password - SUCCESS', () => {
const expectedActions = [
{ type: STATUS_REPLACE, loading: true },
{ type: USER_LOGIN, payload: {email: 'foo@bar.com'} },
{ type: STATUS_REPLACE, loading: false },
]
return store.dispatch(userActions.signInViaEmailProvider(user)).then(() => {
expect(store.getActions()).toEqual(expectedActions)
})
})
it('should do login via email and password - ERROR', () => {
//??????
//HOW to replace the signInWithEmailAndPassword method and return Promise.reject({foo: 'bar'})
const expectedActions = [
{ type: STATUS_REPLACE, loading: true },
{ type: USER_ERROR, message: 'Error login via email' }
]
return store.dispatch(userActions.signInViaEmailProvider(user)).then(() => {
expect(store.getActions()).toEqual(expectedActions)
})
})
})