当预期/接收的值是对象时,Jest.js测试不会通过

时间:2017-02-19 17:03:05

标签: unit-testing redux javascript-objects jestjs

我正在测试这个减速器:

const todo = (state = {}, action) => {
  switch(action.type) {
    case 'ADD_TODO':
      return {
        id: action.id,
        text: action.text,
        completed: false
      }
    case 'TOGGLE_TODO':
      if(state.id !== action.id) {
        return state;
      }
      return {...state, completed: !state.completed};

    default:
      return state;
  }
}

const todos = (state = [], action) => {
  switch(action.type) {
    case 'ADD_TODO':
      return [
        ...state,
        todo(undefined, action)
      ]
    case 'TOGGLE_TODO':
      return state.map(item => todo(item, action));
    default:
      return state;
  }
}

export default todos;

通过这个测试:

import todos from './todos';

test('creates a new todo', () => {
  const stateBefore = [];
  const action = {
    type: 'ADD_TODO',
    id: 0,
    text: 'test'
  };
  const stateAfter = [{
    id: 0,
    text: 'test',
    completed: false
  }];

  expect( JSON.stringify( todos(stateBefore, action) ) ).toBe( JSON.stringify(stateAfter) );
});

问题是,如果我删除Compared values have no visual difference调用,我的测试会失败并显示JSON.stringify()注释 - 我认为将对象与对象进行比较会因为引用而出现一些问题,但我是否必须使用JSON.stringify()或循环对象键每次比较它们?

1 个答案:

答案 0 :(得分:9)

我正在回答我自己的问题。

.toBe方法测试精确(===)相等。为了比较对象,您必须使用.toEqual方法,该方法对每个对象键/数组索引进行递归检查,具体取决于您的数据类型。

总之,您不必使用JSON.stringify()并且Jest为您完成对象键,您只需使用正确的相等测试方法。

来源:https://facebook.github.io/jest/docs/using-matchers.html#content