Integration Testing
Requires global Promise
to be available
For integration testing, Redux Saga Test Plan exports an expectSaga
function
that returns an API for asserting that a saga yields certain effects. To use
expectSaga
, pass in your generator function as the first argument. Pass in
additional arguments which will be the arguments passed on to the generator
function.
expectSaga
runs your saga with Redux Saga's runSaga
function, so it will run
just like it would in your application. This also means your saga will likely
run asynchronously, so expectSaga
will also be asynchronous.
After calling expectSaga
on your saga and making some assertions, you can
start the saga with the run
method. The run
method will return a Promise
,
that you can then use with your favorite testing framework. If any assertions
fail, then expectSaga
will reject the returned Promise
. If all assertions
pass, then the Promise
will resolve.
Look at the example below that uses Jest as
the testing framework. Notice that we return the Promise
so Jest knows when
the test completes. Also notice that we don't even have to bother testing the
call
effect with expectSaga
.
import { call, put } from 'redux-saga/effects';
import { expectSaga } from 'redux-saga-test-plan';
function* mainSaga(x, y) {
yield call([console.log, console], 'hello');
yield put({ type: 'ADD', payload: x + y });
}
it('puts an ADD action', () => {
return expectSaga(mainSaga, 40, 2)
// assert that the saga will eventually yield `put`
// with the expected action
.put({ type: 'ADD', payload: 42 })
// run it
.run();
});