2016-07-29 65 views
3

我最近學習終極版,寫單元測試與使用行動創造者和減速器玩笑Redux的單元測試 - 減速器和行動創造者

我寫測試TDD過程的一部分。但我在努力:我可以在減速器測試中使用動作創建器嗎?

import * as types from './../../constants/auth'; 
import * as actions from './../../actions/auth'; 
import reducer, {initialState} from './../auth'; 

我能做到這一點

it('should set isFetching to true',() => { 
    const expectedState = { 
     ...initialState, 
     isFetching: true 
    } 

    expect(
     reducer(initialState, actions.loginPending()) 
    ).toEqual(expectedState) 
}); 

,而不是這個?

it('should set isFetching to true',() => { 
    const expectedState = { 
     ...initialState, 
     isFetching: true 
    } 

    expect(
     reducer(initialState, {type: types.LOGIN_PENDING}) 
    ).toEqual(expectedState) 
}); 

我來到這無疑是因爲官方文檔使用硬編碼的動作在減速測試:

expect(
    reducer([], { 
    type: types.ADD_TODO, 
    text: 'Run the tests' 
    }) 
).toEqual([{ 
     text: 'Run the tests', 
     completed: false, 
     id: 0 
}]) 

我猜使用硬編碼的行動是最好的做法是不是?

回答

2

有趣的問題,我會說這取決於你如何運行你的測試套件。就我個人而言,我對動作進行硬編碼,因爲如果您仔細考慮它們,他們會聲明性地解釋減速器期望的內容。贊成導入這些動作的論點是,如果你改變了它們的源代碼,測試將不需要更新。但是,這也意味着您在運行這些測試之前期待您的操作始終正確。

如果是這樣的話(如果你總是在這個之前運行你的動作測試套件),那麼將它們導入你的reducer測試套件是合理的。反對這種邏輯的唯一理由是,讓新開發人員僅僅看着Reducer測試套件就可以瞭解Reducer的工作原理並不容易,因爲他們還需要查看動作源文件以查看哪些類型的動作是出動。

另一方面,對行爲進行硬編碼更具說明性,但如果行爲更改,則需要更新每個縮減器測試。我仍然推薦這種方法的原因是,它允許您發送更多受控數據,但我同意它會增加維護成本。

+0

對此有相同的看法,主要是爲了避免「維護成本」。但是,正如你聲明的那樣,它們使它成爲聲明式的,對新開發者來說很有幫助。由於測試不是單獨運行,只需要對操作進行嚴格編碼即可。謝謝 –