如何用 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的主要内容,如果未能解决你的问题,请参考以下文章