私はこのレデューサーをテストしています:
_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()
またはオブジェクトキーをループして毎回比較しますか?
私は自分の質問に答えています。
_.toBe
_メソッドは、正確な(_===
_)等価性をテストします。オブジェクトを比較するには、_.toEqual
_メソッドを使用する必要があります。このメソッドは、データタイプに応じて、すべてのオブジェクトキー/配列インデックスを再帰的にチェックします。
結論として、JSON.stringify()
を使用する必要はなく、Jestはオブジェクトキーを調べます。適切な等価性テストメソッドを使用する必要があります。
ソース: https://facebook.github.io/jest/docs/using-matchers.html#content