2017-02-19 34 views
3

Я тестирование этого редуктора: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)); 
}); 

Проблемы в том, что мои тестах не с замечанием Compared values have no visual difference, если я удалю вызовы JSON.stringify() - я получаю, что сравнение объекта с объектом создает некоторые проблемы из-за ссылки, но мне нужно использовать JSON.stringify() или прокручивать ключи объектов, чтобы сравнивать их каждый раз?

ответ

5

Я отвечаю на свой вопрос.

.toBe метод испытаний для точного (===) равенства. Чтобы сравнить объекты, вы должны использовать метод .toEqual, который выполняет рекурсивные проверки каждого индекса объекта/массива объектов в зависимости от вашего типа данных.

В заключение вам не нужно использовать JSON.stringify(), а Jest проходит через ключи объектов для вас, вам просто нужно использовать правильный метод проверки равенства.

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