web-dev-qa-db-ja.com

Jest.jsテストは、予期された値または受信された値がオブジェクトである場合に合格しません

私はこのレデューサーをテストしています:

_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()またはオブジェクトキーをループして毎回比較しますか?

9
macbem

私は自分の質問に答えています。

_.toBe_メソッドは、正確な(_===_)等価性をテストします。オブジェクトを比較するには、_.toEqual_メソッドを使用する必要があります。このメソッドは、データタイプに応じて、すべてのオブジェクトキー/配列インデックスを再帰的にチェックします。

結論として、JSON.stringify()を使用する必要はなく、Jestはオブジェクトキーを調べます。適切な等価性テストメソッドを使用する必要があります。

ソース: https://facebook.github.io/jest/docs/using-matchers.html#content

11
macbem