jest-saga
v1.0.0
Published
A Jest `expect` extension to quickly test a `redux-saga` generator.
Downloads
2
Readme
jest-saga
A Jest expect
extension to quickly test a redux-saga
generator.
Usage
First, import the package from your Jest setupTestFrameworkScriptFile
:
import 'jest-saga';
An expect
extension will now be available in your tests called toProduceEffects
.
Use the expect extension to make assertions about the effects a saga produces and inject yielded values.
import exampleSaga from 'sagas/exampleSaga';
expect(exampleSaga()).toProduceEffects([
call(mockApiRequest, 'bar'),
put(actionCreator()),
call(foo, 'corge'),
], [
mockApiResponse,
null,
'etc',
]);
expect
should be passed the generator function itself for the saga.
The signature of toProduceEffects
is (expectedEffects, yieldedValues = [])
. expectedEffects
is a list of effects you expect the saga to produce with each iteration. yieldedValues
is an optional way to inject yielded values from your effects. For instance, in the example above, when the saga calls yield call(mockApiRequest, 'bar')
, mockApiResponse
will be returned as the execution continues.
Advanced Assertions
There are two more ways you can describe expectations for produced effects:
import { ANY } from 'jest-saga'
:ANY
can be passed instead of an expected effect to match anything. I'm not sure there's a legitimate use case for this (unless laziness is legitimate), as your sagas should produce predictable and expect-able results, but it exists anyway.(value) => true|false
: Pass a function instead of an effect to do more advanced assertions. You'll receive thevalue
from the generator iteration, which should be the yielded effect from the saga in raw form. Here you can make assertions about the contents of the effect, or capture the effect in a scoped variable for further testing. Returntrue
if the assertion should pass,false
if not.
The latter method can be used for testing forked sagas:
let forkedSaga;
expect(parentSaga()).toProduceEffects([
(effect) => {
const isFork = !!effect.FORK;
if (isFork) {
forkedSaga = effect.FORK.fn;
}
return isFork;
},
]);
expect(forkedSaga()).toProduceEffects([
call(foo, 'bar'),
]);
It's not exactly idiomatic. Improvements could be made. But the functionality is available.