2017-02-09 6 views
4

私はRedux Sagasのドキュメントに従ってテストを作成しましたが、それは私には非常に脆弱に見えます。私のサガでロジックを更新するたびに、テストは失敗します。これは私の頭の中で警鐘を発し、私が何か間違っていると思うように導く。ユニットテストRedux Sagas

ここでは、ユーザーのプロファイルをロードし、Reduxの状態でそれを保存するためのAPIと通信の例のサガです:

export function* userAuthCheck() { 
    try { 
     yield put({ type: START_HTTP }); 

     const me = yield apply(user, user.me); 
     const organisations = yield apply(user, user.organisations, [me.body.data.id]); 

     yield put({ 
      type: USER_AUTH_SUCCESS, 
      redirect: true, 
      state: { 
       account: me.body.data, 
       organisations: organisations.body.data, 
      }, 
     }); 
    } catch (error) { 
     yield put({ type: USER_AUTH_REFRESH }); 
    } finally { 
     yield put({ type: COMPLETE_HTTP }); 
    } 
} 

は、ここで対応するテストです:

it('can successfully call the API',() => { 
    const generator = userAuthCheck(); 

    expect(generator.next().value).toEqual(put({ type: START_HTTP })); 
    expect(generator.next().value).toEqual(call(user.me)); 

    expect(generator.next().value).toEqual(put({ 
     type: USER_AUTH_SUCCESS, 
     state: { user: undefined }, 
    })); 

    expect(generator.next().value).toEqual(put({ type: COMPLETE_HTTP })); 
}); 

あなたがいることに気づくかもしれません私はサガを最近更新して以来、私はそれを更新していないので、テストが実際に失敗するでしょう。これは思考の道筋で私を始めたものです。

私のサガをテストする良い方法はありますか?それらを最初から最後まで実行し、異なるAPIレスポンスを模倣し、適切なものが状態にディスパッチされることを主張しますか? https://redux-saga.github.io/redux-saga/docs/introduction/BeginnerTutorial.html

+3

これはおそらく助けになるかもしれません:https://github.com/jfairbank/redux-saga-test-plan – jkrnak

+1

私は 'next()'でかなり簡単に応答をシミュレートできるようですが、私はまだ必要です私がサガを変更するたびにテストを更新します。おそらく、ジェネレータ関数と 'yield'を使うときは避けられません。 – edcs

答えて

1

この程度の長い問題のスレッドがissue #518ための再来 - 佐賀問題追跡であり:

これらは、私は、次のしてきたドキュメントです。だから合意した正しい方法でテストすることはできませんが、そこにはいくつかのオプションがありますが、最良の方法はテストしているものに正確に依存していると言います。

が上記のスレッドで述べたいくつかのテストヘルパーパッケージは次のようにありますから学ぶことthe redux-saga test suiteでいくつかの良い例もあります

。私はあなたの例のために、それはのようなものになるだろうので、店をあざけることによってそれをテストしたいと

1

:私はこのアプローチについては好きで何

import configureMockStore from "redux-mock-store"; 
import createSagaMiddleware from "redux-saga"; 
import rootSaga from "pathToRootSaga/rootSaga"; 
import {userAuthCheckActionCreator} from "yourPath/UserActionCreators"; 

it('can successfully call the API',() => { 
    const sagaMiddleware = createSagaMiddleware(); 
    const mockStore = configureMockStore([sagaMiddleware]); 
    const store = mockStore({}); 
    sagaMiddleware.run(rootSaga); 

    const expectedActions = [ 
    { 
     type: START_HTTP 
    }, 
    { 
     type: USER_AUTH_SUCCESS, 
     redirect: true, 
     state: { 
      account: me.body.data, 
      organisations: organisations.body.data, 
     } 
    }, 
    { 
     type: COMPLETE_HTTP 
    } 
    ]; 

    store.dispatch(userAuthCheckActionCreator()); 
    expect(store.getActions()).toEqual(expectedActions); 
}); 

は、アクションの全配列がある場合、私ははっきりと見ることができるということです期待された順序で派遣される。さらに、擬似ストアのコンテキスト内ですべてが発生し、Sagaミドルウェアがアクションをディスパッチさせるので、ジェネレータ機能を操作する必要はありません。

関連する問題