2017-07-30 9 views
0

redux-sagasとgenerator関数を使用するReactネイティブプロジェクトのJestを使用してテストを作成するところです。私はテストで多くの経験を持っていないので、これが何か基本的なものであれば、私の無知を許してください。redux-sagaのjestテストで複数の値を生成するには

私は次の関数を持っています。これは、別の関数の結果を返すことに基づいて変数を定義しています。私はそれがgetAssetByIdを呼び出すと、bearerTokenが定義されていない私のテスト

const stepper = (fn) => (mock) => fn.next(mock).value 

test('getAssets',() => { 
    const step = stepper(getAssets(FixtureAPI)) 
    const bearerToken = 'bearer_test_token' 
    const timelines = 'mocked for brevity' 

    expect(step()).toEqual(select(selectBearerToken)) 
    expect(step()).toEqual(select(selectTimelines)) 
    expect(step(timelines)).toEqual(call(FixtureAPI.getAssetById(bearerToken, 'B13fGCE_l'))) 
}) 

問題

export function * getAssets (api) { 
    const bearerToken = yield select(selectBearerToken) 
    const timelines = yield select(selectTimelines) 

    if (timelines) { 
    // Do stuff with timelines 
    const response = yield call(api.getAssetById, bearerToken, 'abc123') 
    } 
} 

...複数の変数を模擬する方法

My機能を把握することはできませんただし、timelinesが定義されています。私はstep()にそれを渡したので。どのようにしてtimelinesbearerTokenstep()に渡すことができますか?それは私がそれをやる方法さえありますか?

答えて

1

JavaScriptジェネレータについては、https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators、特に先進のジェネレータの部分を読むのに少し時間を費やすことができます。

短いストーリー、yieldは、コールのyieldキーワードに続く式の評価の値を返します。この場合、step()を初めて呼び出す場合、戻り値はselect(selectBearerToken)と評価される必要があります。 next.next(val)の値を取り込むことができ、これはyield呼び出しの戻り値として返されます。それはstep()timelinesで3回目に呼び出すと、先にyieldコールにtimelinesを返信してから、次のyieldに進み、停止して戻ります。

これを正しくテストする方法は、2回目のstep()コールであり、bearerTokenの値も返します。つまり、expect(step(bearerToken)).toEqual(select(selectTimelines))です。次に、bearerTokenを設定する必要があります。

IMOの理解を容易にするために、step()の呼び出しをアサーションと区別することをお勧めします。

+0

ありがとうございます。私は前の 'step()'に結果を渡すことは後で利用できないと考えて間違っていました。 –

関連する問題