Как переопределить пользовательскую ложную реализацию модуля 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)
    })

  })


})

0 ответов

Другие вопросы по тегам