web-dev-qa-db-fra.com

Les tests Jest.js ne réussissent pas lorsque les valeurs attendues / reçues sont des objets

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?

9
macbem

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

11
macbem