2017-02-19 25 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