2017-06-19 68 views
0

我正在進行單元測試,我想測試一下redux商店中的值是否根據我的指示進行了更新。變量未在單元測試中更新

我的module reducer單元測試包含多個測試套件,有些是更新狀態,有些不是,我不知道爲什麼...所以我經過一天的測試和研究後來到這裏,看看有人可能知道我錯誤的原因。任何建議表示讚賞。

這裏是我的模塊減速機代碼的一部分:

export function createModuleReducer() { 
    return function moduleReducer(state: PageModules = INITIAL_STATE, 
    action): PageModules { 
     if (!action.meta || !action.meta.status) { 
     return state; 
     } 
     switch (action.type) { 
     case INITIALIZE: 

     case CREATE_SIGNATURES_ARRAY: 
      return tassign(state, {signatures: action.payload['document']}); 

這裏是我的模塊減速規範代碼的一部分:

const baseState = { 
    signatures: [] 
}; 
let state; 
… 
describe('Reducer',() => { 
    … 
    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
    … 
    MockNgRedux.reset(); 
    state = JSON.parse(JSON.stringify(baseState)); 
    })); 

    it('should call CREATE_SIGNATURES_ARRAY reducer', async(() => { 
    const actionCreateSignature = { 
     type: CREATE_SIGNATURES_ARRAY, 
     meta: { status: 'create_signature'}, 
     payload: { 'document': … } 
    }; 
    createModuleReducer()(state, actionCreateSignature); 
    mockNgRedux.dispatch(actionCreateSignature); 
    expect(state.signatures).toEqual(…) 
    })); 
} 

使用的console.log,我知道module reducer更新相應的商店,但規格中的值不會改變。

回答

0

減速器應該是最容易測試的部分,因爲它們是純粹的功能。
根據你如何實現你的reducer,你可能不需要TestBed。
你也可能不需要MockNgRedux。我只在使用@select的組件測試中使用它。

您傳遞給reducer的狀態應該只是reducer負責的片段,在這種情況下是它的簽名屬性?因此,也許你的測試呼叫應

createModuleReducer()(state.signatures, actionCreateSignature); 

我還建議把一個console.log(state)你的期望之前,看到減速機是如何對待它。

爲了給出進一步的建議,需要了解更多關於createModuleReducer()方法。
另外,mockNgRedux.dispatch()看起來不正確。我所看到的所有電話都是靜態的M ockNgRedux(該類)。

+0

我更新了我與createModuleReducer功能,這是一種含有開關功能的答案! –

0

問題修復了,感謝Richard Matsen和Redux關於測試減速器的文檔的建議!

我現在直接測試createModuleReducer:

expect(createModuleReducer()(state, actionCreateSignature).signatures).toEqual(…)