javascript - redux-saga-test-plan expectSaga- 使用状态分支测试 reducer

标签 javascript typescript redux redux-saga redux-saga-test-plan

我在正确测试我的 saga 时遇到了一些麻烦。问题源于这样一个事实,即在运行 saga 时,reducer 安装在 state: {...initialState} 而我的 saga select 效果期望 reducer 安装在状态:{认证:{...initialState}}

因此我无法完全测试 reducer/saga 组合,因为最终状态对象的形状与商店的实际形状不一致。

正在测试的传奇:

export default function* rootAuthenticationSaga() {
  while (true) {
      refreshToken = yield select((state: ApplicationRootState) => state.authentication.refreshToken);
      ... more code here
}

我的一个测试如下:

    test('logs the user in if they provide a valid email and password', () => {
      const mockRefreshPoller = createMockTask();
      const initialState = {
        accessToken: '',
        refreshToken: '',
        userId: '',
      }
      return expectSaga(rootAuthenticationSaga)
        .withReducer(authenticationReducer, initialState)
        .provide([
          // some mock providers set up here
        ])
        // ...more asserts here
        .put(authenticationActions.saveTokens({accessToken: 'VALID_ACCESS_TOKEN', refreshToken: 'VALID_REFRESH_TOKEN'}))
        .hasFinalState({
           accessToken: 'VALID_ACCESS_TOKEN',
           refreshToken: 'VALID_REFRESH_TOKEN',
           userId: 'USER_ID',
        })
        .dispatch(authenticationActions.login.request({email: 'VALID_EMAIL', password: 'VALID_PASSWORD'}))
        .run()
    });

在上面的测试中,select() 失败,因为正确的路径(通过 withReducer 注入(inject))位于 state.refreshToken 而不是 state.authentication。刷新 token

如果我通过 withState({authentication: {refreshToken, ...}}) 注入(inject)状态,那么 select 会按预期工作,但是所有的 reducer Action 都会发生针对状态根,我的最终状态具有(不正确的)形状:

{state: 
  authentication: {
    refreshToken: '',
    ...
  },
  refreshToken: 'VALID_REFRESH_TOKEN',
  ...
}

最佳答案

这样做的诀窍是通过创建一个

const reducerUnderTest = createReducer({
  authentication: authenticationReducer,
})

并将其传递到具有正确形状状态的 withReducer(reducerUnderTest, {authentication: {...initialState}}

关于javascript - redux-saga-test-plan expectSaga- 使用状态分支测试 reducer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55246101/

相关文章:

javascript - 从 Javascript 输入变量到 Mysqli 数据库

javascript - 如何在 knockout 中调试模板化绑定(bind)?

javascript - 如何在 const 中存储数组

javascript - 数据表列过滤器文本范围搜索

javascript - 在 JavaScript 中向选择添加选项不更新

angular - 将 PubNub 链接到 Angular5 以在网络应用程序中发布数据

node.js - Docker + 私有(private) npm 包 = 找不到模块/找不到模块

reactjs - Saga 观察者未接收或处理调度的操作

reactjs - Redux Sagas 未使用 redux persist 和connected-react-router 输入

javascript - requestAnimationFrame 的目的是什么?重绘时间没有任何区别