2017-09-23 52 views
0

我正在使用Redux展開運算符來希望將狀態保持爲不可變對象。基本reducer可能會突變應用程序狀態

但是,我正在設法使最簡單的單元測試失敗。

我認爲這個錯誤可能與不可變的問題有關,但是我沒有正確使用spread運算符嗎?

這裏是我的單元測試:

describe('app logic',() => { 
 
    it('initialises app',() => { 
 
    const newState = reducer(INITIAL_STATE, {type: "NEXT"}) 
 
    const expectState = { 
 
     start: true, 
 
     render_component: null, 
 
     requests: {}, 
 
     results: {}, 
 
    } 
 
    console.log('newState', newState) 
 
    console.log('expected state', expectState) 
 
    expect(newState).to.equal(expectState) 
 
    }) 
 
})

,這裏是我的減速器

export const INITIAL_STATE = { 
 
    start: false, 
 
    render_component: null, 
 
    requests: {}, 
 
    results: {} 
 
} 
 

 
export const next = (state) => { 
 
    if (state === INITIAL_STATE) { 
 
    return { 
 
     ...state, 
 
     start: true, 
 
    } 
 
    } 
 
    return state 
 
} 
 

 
export function reducer(state = INITIAL_STATE, action) { 
 
    switch (action.type) { 
 
    case 'NEXT': 
 
     return next(state) 
 
    default: 
 
     return state 
 
    } 
 
}

我打印了兩個對象,而t嘿看起來一樣。 我得到的錯誤:

1)應用邏輯初始化程序:

AssertionError: expected { Object (start, render_component, ...) } to equal { Object (start, render_component, ...) } 

回答

1

不知道到底該測試庫,你正在使用,但平時喜歡.equal名稱是用來測試全等(===)這意味着(至少在對象的情況下)被比較的兩件事實際上必須引用完全相同的對象。因此,例如,

const original = { a: 1 }; // creates a new object, assign it 
const testMe = { a: 1 }; // creates another new object, assign it 
console.log(original === testMe) // false 

評估爲假,因爲當對象具有相同內容,他們不引用完全相同的對象。它們是獨立的,獨立創建的,恰好具有相同內容的對象。與此相比,

const original = {a: 1}; // create a new object 
const testMe = original; // create another reference to the same object 
console.log(original === testMe); // true 

所以,當你返回

return { 
    ...state, 
    start: true, 
} 

要創建並返回一個新的對象,因此它自然也引用您創建並分配給變量名稱相同的對象expectedState

如果您感興趣的並不是嚴格的平等,而只是兩個對象中的內容相同,除.equal之外還存在其他方法,通常將其命名爲deep(因爲它們深入對象/數組/無論檢查值是否相同)。

Chai.js在他們的文檔都expect(x).to.equal(y)expect(x).to.deep.equal(y)的例子:http://chaijs.com/api/bdd/#method_equal

你的測試庫可能有非常相似,如果不相同,語法。