javascript - 如何修复 TypeError 不是一个函数(用 Jest 测试 promises)

标签 javascript reactjs unit-testing mocking jestjs

感谢这里的答案,我现在通过了测试:How to test is chained promises in a jest test?

但是我在测试的 catch 部分仍然遇到错误。

我似乎无法在操作文件中正确地模拟或监视这部分:.then(res => res.getIdToken())

TEST signIn ERROR => TypeError: res.getIdToken is not a function

enter image description here

测试

jest.mock('services/firebase', () => new Promise(resolve => resolve({
  signInWithEmailAndPassword: () => Promise.resolve({ getIdToken: 'abc123' }),
  getIdToken: () => jest.fn(),
  signOut: () => jest.fn()
})));

describe('login actions', () => {
  let store;

  beforeEach(() => {
    store = mockStore({});
  });

  it('signIn should call firebase', () => {
    const user = {
      email: 'first.last@yum.com',
      password: 'abd123'
    };

    return store.dispatch(signIn(user.email, user.password))
      .then(() => {
        console.log('TEST signIn SUCCESS');
        expect(mockSignIn).toHaveBeenCalled();
        expect(store.getActions()).toEqual({
          type: USER_ON_LOGGED_IN
        });
      })
      .catch((err) => {
        console.log('TEST signIn ERROR =>', err);
      });
  });

登录操作/登录

// Sign in action
export const signIn = (email, password, redirectUrl = ROUTEPATH_DEFAULT_PAGE) => (dispatch) => {
  dispatch({ type: USER_LOGIN_PENDING });

  return firebase
    .then((auth) => {
      console.log('auth =>', auth);
      return auth.signInWithEmailAndPassword(email, password);
    })
    .catch((e) => {
      console.error('actions/Login/signIn', e);
      // Register a new user
      if (e.code === LOGIN_USER_NOT_FOUND) {
        dispatch(push(ROUTEPATH_FORBIDDEN));
        dispatch(toggleNotification(true, e.message, 'error'));
      } else {
        dispatch(displayError(true, e.message));
        setTimeout(() => {
          dispatch(displayError(false, ''));
        }, 5000);
        throw e;
      }
    })

    // I can't seem to mock this correctly
    .then(res => res.getIdToken())
    .then((idToken) => {
      if (!idToken) {
        dispatch(displayError(true, 'Sorry, there was an issue with getting your token.'));
      }

      dispatch(onCheckAuth(email));
      dispatch(push(redirectUrl));
    });
};

最佳答案

看起来您收到此错误的原因与您通过 Jest 模拟的数据有关。

尝试使用 jest.fn() 将您的 getIdToken 模拟为函数,而不是字符串:

const mockGetIdToken = jest.fn(() => 'abc123');

jest.mock('services/firebase', () => new Promise(resolve => resolve({
  signInWithEmailAndPassword: () => Promise.resolve({ getIdToken: mockGetIdToken }),
  getIdToken: mockGetIdToken,
  signOut: () => jest.fn()
})));

describe('login actions', () => {
  let store;

  beforeEach(() => {
    store = mockStore({});
  });

  it('signIn should call firebase', () => {
    const user = {
      email: 'first.last@yum.com',
      password: 'abd123'
    };

    return store.dispatch(signIn(user.email, user.password))
      .then(() => {
        console.log('TEST signIn SUCCESS');
        expect(mockSignIn).toHaveBeenCalled();
        expect(store.getActions()).toEqual({
          type: USER_ON_LOGGED_IN
        });
      })
      .catch((err) => {
        console.log('TEST signIn ERROR =>', err);
      });
  });

关于javascript - 如何修复 TypeError 不是一个函数(用 Jest 测试 promises),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48508225/

相关文章:

javascript - 无法达到某个值......ReactJS

javascript - 如何自定义 Jasmine 的目录结构?

java - 如何调用模拟模拟对象的实际构造函数?

java - Spring Boot 单元测试 - 缺少 bean 运行测试

javascript - Object.create 说明

javascript - 如何 document.querySelectorAll() 仅检查项目

javascript - jQuery .wrap() 无需重新聚焦

javascript - 内容高度/宽度更改后如何调整 nyroModal 的大小

html - React 设置 audio.ended 监听器

python - 如何在 Django RESTful API 和 React 中使用 csrf_token?