Je teste ce réducteur:
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;
Avec ce test:
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) );
});
Le problème est que mes tests échouent avec une remarque Compared values have no visual difference
Si je supprime les appels JSON.stringify()
- j'obtiens que la comparaison d'un objet à un objet pose des problèmes à cause de la référence, mais dois-je utiliser JSON.stringify()
ou parcourir les clés d'objet pour les comparer à chaque fois?
Je réponds à ma propre question.
La méthode .toBe
Teste l'égalité exacte (===
). Pour comparer des objets, vous devez utiliser la méthode .toEqual
Qui effectue des vérifications récursives de chaque index de clé/tableau d'objet, selon votre type de données.
En conclusion, vous n'avez pas besoin d'utiliser JSON.stringify()
et Jest passe par les clés d'objet pour vous, il vous suffit d'utiliser la bonne méthode de test d'égalité.
Source: https://facebook.github.io/jest/docs/using-matchers.html#content