Testing generator function never been easy
npm install jest-generator


Testing generators are verbose as they require calling next method of generator each time you want to iterate. jest-generator encapsulates all iteration and assertion logic itself. It provides easy and readable API for testing generator functions.
``bash
yarn add --dev jest-generator
`
or
`bash
npm install --save-dev jest-generator
`
#### Via setupTestFrameworkScriptFile config
Add jest-generator to your Jest setupTestFrameworkScriptFile configuration
`json`
"jest": {
"setupTestFrameworkScriptFile": "jest-generator"
}
#### Via setupTest script
Require jest-generator from setupTest script
`js
// ./setupTest.js
require('jest-generator');
`
Then add this config
`json`
"jest": {
"setupTestFrameworkScriptFile": "./setupTest.js"
}
`js
// ./pay.js
export default function* pay() {
yield validatePayment();
yield makePayment();
return finishPayment();
}
`
`js
// ./pay.test.js
import pay from './pay';
test('should work correctly', () => {
const iterator = pay();
expect(iterator).toMatchYields([
[validatePayment()],
[makePayment()],
[finishPayment()]
]);
});
`
`js
// ./books.js
export function* loadBooks(params) {
try {
const response = yield call(api.loadBooks, params)
yield put(booksLoadedSuccess(response))
} catch (error) {
yield put(booksLoadFail(error.message))
}
}
`
`js
// ./books.test.js
import { loadBooks } from './books';
test('should handle success response', () => {
const params = { id: 201 };
const iterator = loadBooks(params);
const response = [];
expect(iterator).toMatchYields([
[call(api.loadBooks, params), response],
[booksLoadedSuccess(response)],
]);
});
test('should handle error response', () => {
const params = { id: 201 };
const iterator = loadBooks(params);
const response = new Error('failed to load books');
expect(iterator).toMatchYields([
[call(api.loadBooks, params), response],
[put(booksLoadFail(response.message))],
]);
});
`
`js`
.toMatchYields(
yieldValues: [
[yieldValue: any, returnType?: any | Error]
]
)
Matches iterator against given yield values
`js`
expect(itetaor).toMatchYields([
[callAPI()]
])
In order to return value from yield, simply pass your return value as second array value
`js
function* gen() {
const response = yield fetch()
yield update(response)
}
const mockResponse = {};
const iterator = gen();
expect(iterator).toMatchYields([
[fetch(), mockResponse],
[update(mockResponse)]
])
`
In order to throw error from yield, you should simply pass Error instance to return type
`js
function* gen() {
const response = yield fetch()
yield update(response)
}
const mockErrorResponse = new Error('network error');
const iterator = gen();
expect(iterator).toMatchYields([
[fetch(), mockErrorResponse],
[handleError(mockErrorResponse)]
])
``
This project is licensed under the MIT License - see the LICENSE file for details