在Redux中测试动作创建者时,如何模拟Firebase SDK?

db9*_*998 6 unit-testing firebase reactjs jestjs redux

我正在使用React,Redux和Firebase进行POC.我目前正在研究如何测试动作创作者.我跟着这个- https://redux.js.org/recipes/writing-tests#async-action-creators指南,它已经有用至今.但是,作为一个简单的示例,我想测试在使用Firebase成功进行身份验证后调度操作,如此 -

行动创造者

export const authenticate = (username, password) => {
  return dispatch => {
    firebase.auth().signInWithEmailAndPassword(username, password)
      .then(() => {
        dispatch(authenticationSuccessful())
      })
      .catch(() => {

      });
  }
};
Run Code Online (Sandbox Code Playgroud)

行动

const authenticationSuccessful = () => {
  return {
    type: actionTypes.AUTHENTICATION_SUCCESSFUL
  };
};
Run Code Online (Sandbox Code Playgroud)

对于测试方面我喜欢的东西,redux-mock-store和expect.我已经研究过其他人在这个场景中使用了什么,我还没有找到明确的答案,我也看过https://www.npmjs.com/package/firebase-mock但是我没有知道这是否是社区内的热门选择.

真的很感激任何提前帮助!

Lex*_*Lex 3

这个答案符合要求 使用 Jest 对依赖于 http 调用的代码进行单元测试的最佳方法?

根据该答案,这将覆盖signInWithEmailAndPassword允许您的代码通过而不命中 firebase 的规则。下面的示例可能需要一些调整。不确定 的范围dispatch

jest.mock('pathToFireBase', () => ({
   signInWithEmailAndPassword(email, password) {
     return Promise.resolve({name: 'someUser'})
   }
}))

const dispatch = jest.fn();
firebase.auth().signInWithEmailAndPassword(username, password)
expect(dispatch.mock.calls.length).toBe(1);
Run Code Online (Sandbox Code Playgroud)

另一种选择(对于 Node.js)是使用VCR之类的东西。一个选项是棕褐色。它由 LinkedIn 构建,因此可能得到更好的维护和测试。使用此工具,您可以记录您的请求一次,保存响应,并在调用时重播。此选项避免了模拟,但通过预定义的响应使 uint 测试保持快速。不过我不知道有这样的前端选项。


Firebasemock 看起来是一个不错的选择。虽然我看不到signInWithEmailAndPassword. 身份验证是通过显式设置状态来完成的。身份验证示例

mocksdk.auth().changeAuthState({
  uid: 'testUid',
  provider: 'custom',
  token: 'authToken',
  expires: Math.floor(new Date() / 1000) + 24 * 60 * 60,
  auth: {
    isAdmin: true
  }
});
mocksdk.auth().flush();
console.assert(document.location.href === '#/admin', 'redirected to admin');
Run Code Online (Sandbox Code Playgroud)