如何用 jest 测试 combineReducers

Posted

技术标签:

【中文标题】如何用 jest 测试 combineReducers【英文标题】:how to test combineReducers with jest 【发布时间】:2019-08-17 18:38:31 【问题描述】:

我正在尝试测试 combineReducers 但出现以下错误。

TypeError:_testReducer.testReducer.test11 不是函数

下面是reducer

// testReducer.js
import  combineReducers  from "redux-immutable";
const test11 = (state, action) => 
 switch (action.type) 
    case "temp11":
      return true;
    default:
      return state;
  
;
const test22 = (state, action) => 
 switch (action.type) 
    case "temp22":
      return false;
    default:
      return state;
  
;
export const testReducer = combineReducers(
  test11,
  test22,
);

下面是测试用例

// testReducer.test.js
import  testReducer  from "./testReducer.js";
describe("test for testReducer", () => 
  it("test11", () => 
    const returnTrueValue = true;
    expect(
      testReducer.test11(
        true, 
          type: "temp11",
        
      )
    ).toEqual(returnTrueValue);
  );
  it("test11", () => 
    const returnFalseValue = false;
    expect(
      testReducer.test22(
        true, 
          type: "temp22",
        
      )
    ).toEqual(returnFalseValue);
  );
);

如果我在 reducer 中导出所有函数并在测试用例中导入单个函数,它会起作用,但这不是想法案例。

【问题讨论】:

【参考方案1】:

combineReducers 返回一个函数,该函数合并了您放入其中的所有减速器的状态。它不允许您访问单个减速器并单独调用它们。

您应该以这种方式使用它:

expect(
    testReducer(true, type: "temp11").test11
).toEqual(returnTrueValue);

【讨论】:

@swapnilpatil24 很高兴它有帮助:) 欢迎您接受答案作为解决方案【参考方案2】:

我假设组件化简器如下所示:

export const initialState = 
  totalValue: 0
;

const DashboardReducer = (state = initialState, action: any)=> 
  switch(action.type) 
    case 'case1':
     .......
     .......
     .......
    default:
      return state;
 

我假设 root reducer 如下所示:

export const rootReducer = combineReducers(
  dashboard: DashboardReducer
);

测试文件应如下所示:

import  rootReducer  from './root.reducer';
import  createStore  from 'redux';
import  initialState as dashboardState  from './modules/uv_dashboard/uv_dashboard.reducer';

describe('Root Reducer Suite', () => 

  let store = createStore(rootReducer)

  test('loaded correctly', () => 
    expect(store.getState().dashboard).toEqual(dashboardState);
  );
);

【讨论】:

以上是关于如何用 jest 测试 combineReducers的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Jest 正确实现这样的测试套件架构?

如何用 Jest 测试一系列数字?

如何用 jest 测试 nuxt?

如何用 jest 在服务 (NestJS) 中测试模型 (Mongoose)

如何用 jest 测试此 api 中间件是不是处理 fetch 引发的错误?

如何用 jest 测试 axios 拦截器