2016-07-29 16 views
3

私は最近、Reduxのを学習し、行動のクリエイターと減速のための冗談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

興味深い質問ですが、テストスイートをどのように実行するかによって異なります。個人的に、私はあなたがそれについて考えるなら、彼らは減速機が期待していることを宣言的に説明するので、アクションをハードコーディングします。アクションをインポートすることを支持する議論は、ソースを変更した場合、テストを更新する必要がないということです。ただし、これは、これらのテストを実行する前に、あなたの行動が常に正しいと期待していることを意味します。

これが当てはまる場合(この前に常にアクションテストスイートを実行している場合)、それをあなたのレデューサーテストスイートにインポートすることは合理的です。このロジックに対する唯一の議論は、新しい開発者にあなたのレデューサーテストスイートを見るだけであなたのレデューサーがどのように動作するのかを知ることは容易ではないということです。発送します。

一方、アクションのハードコーディングはより宣言的ですが、アクションが変更された場合は、各レデューサーテストを更新する必要があります。私がまだこのアプローチを推奨しているのは、より制御されたデータを送ることができるということですが、保守コストが増加することに同意します。

+0

主にその "メンテナンスコスト"を避けるために、同じ考えを持っていました。しかし、ハードコーディングを宣言すると、それは新しい開発者のために役立ちます。テストが別々に実行されているわけではないので、単にハードコードで実行してください。ありがとう –

関連する問題