Test Sagas with reselect
How to successfully test a `yield select(selector)` with jasmine?
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.6.0/redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux-saga/0.14.5/redux-saga.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.23.0/polyfill.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/reselect/3.0.0/reselect.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.5.2/jasmine.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.5.2/jasmine.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.5.2/jasmine-html.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.5.2/boot.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>
Babel + JSX
const { takeEvery, put, select } = ReduxSaga.effects;
const { createSelector } = Reselect;
const { fromJS } = Immutable;
const SEND_MESSAGE = 'sendMessage';
const MESSAGE_SENT = 'messageSent';
const SEND_ERROR = 'sendError';
const selectDomain = () => (state) => state.get('myDomain');
const selectDomainConfig = () => createSelector(selectDomain(), (domain) => domain.get('config'));
const selector = createSelector(selectDomain(), (domain) => domain.get('message'))
const selectDomainMessage = () => selector;
function sentAction(message) {
return {
type: MESSAGE_SENT,
message,
};
}
function sendError(error) {
return {
type: SEND_ERROR,
error,
}
}
function* send() {
const message = yield select(selectDomainMessage());
try {
const config = yield call(selectDomainConfig());
yield put(sentAction(message));
} catch (error) {
yield put(sendError(error));
}
}
function* watchSender() {
yield takeEvery(SEND_MESSAGE)
}
describe('watchSender Saga', () => {
const generator = watchSender();
it('returns takeEvery descriptor', () => {
const expectedDescriptor = takeEvery(SEND_MESSAGE);
const returnedDescriptor = generator.next().value;
expect(returnedDescriptor).toEqual(expectedDescriptor);
})
});
describe('send Saga', () => {
const generator = send();
const state = fromJS({ myDomain: { config: { user: 'me' }, message: 'Hello World' }});
it('returns select descriptor', () => {
let expectedDescriptor = select(selectDomainMessage());
let returnedDescriptor = generator.next().value;
expect(returnedDescriptor).toEqual(expectedDescriptor);
});
});