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

Posted

技术标签:

【中文标题】在 Redux 中测试动作创建者时如何模拟 Firebase SDK?【英文标题】:How do you mock the Firebase SDK when testing action creators in Redux? 【发布时间】:2018-11-18 09:07:34 【问题描述】:

我正在使用 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(() => 

      );
  
;

动作

const authenticationSuccessful = () => 
  return 
    type: actionTypes.AUTHENTICATION_SUCCESSFUL
  ;
;

对于我开玩笑的事情的测试方面,redux-mock-store 和期望。我研究了其他人在这种情况下使用了什么,但我还没有找到明确的答案,我也看过https://www.npmjs.com/package/firebase-mock,但我不知道这是否是社区中的热门选择。

非常感谢您提前提供的任何帮助!

【问题讨论】:

【参考方案1】:

这个答案符合要求Best way to unit test code that depends on http calls using Jest?

根据那个答案,这将覆盖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);

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


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

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');

【讨论】:

以上是关于在 Redux 中测试动作创建者时如何模拟 Firebase SDK?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试仅调度其他操作的 Redux 操作创建器

在 Redux 操作中模拟一个函数

如何使用 Redux connect 中的操作对测试组件进行快照?

用 jest 测试 redux 异步动作创建者

如何键入 Redux thunk 动作创建者以返回承诺

如何在 react-redux 中正确键入映射到道具的动作创建者