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

Posted

技术标签:

【中文标题】当预期/接收的值是对象时,Jest.js 测试不通过【英文标题】:Jest.js tests don't pass when expected/received values are objects 【发布时间】:2017-07-08 21:07:56 【问题描述】:

我正在测试这个减速器:

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

问题是,如果我删除 JSON.stringify() 调用,我的测试会失败并带有 Compared values have no visual difference 备注 - 我知道将对象与对象进行比较会因为引用而产生一些问题,但我必须使用 JSON.stringify()还是循环遍历对象键以每次比较它们?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

另外,如果其他任何东西刚刚开始使用 React/Jest/Enzyme 进行测试......即使在对所有内容进行字符串化之后,我也会遇到同样的错误!我忘了为我的独特列表项模拟“键”!期望值等于:"\"type\":\"li\",\"key\":null,\"ref\":null,\"props\":\"children\":\" egg\",\"_owner\":null,\"_store\":" 收到:"\"type\":\"li\",\"key\":\"0\" ,\"ref\":null,\"props\":\"children\":\"eggs\",\"_owner\":null,\"_store\":" 仅在字符串化后就像官方的答案一样,我能够找出我哪里出错了!太棒了!

以上是关于当预期/接收的值是对象时,Jest.js 测试不通过的主要内容,如果未能解决你的问题,请参考以下文章

Jest.js强制窗口未定义。

当断言函数返回预期的 DTO 对象时,如何在 DTO 对象类的 getter 上获得 100% 的测试覆盖率?

观看并重新运行 Jest JS 测试

Jest.js 强制窗口未定义

反应原生 jest.preset.js 文件丢失错误

当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是多少?