Blog>
Snippets

Error Handling in Saga Tests

Demonstrate effective strategies for testing error handling within sagas, including how to mock error scenarios and assert that the saga handles them as expected.
import { testSaga } from 'redux-saga-test-plan';
import { throwError } from 'redux-saga-test-plan/providers';
import { fetchUserData, api } from './sagas';

// Saga function to be tested
function* fetchUserData(userId) {
  try {
    const data = yield call(api.getUser, userId);
    yield put({ type: 'FETCH_SUCCESS', data });
  } catch (error) {
    yield put({ type: 'FETCH_FAILURE', error });
  }
}
This is the saga function that fetches user data. It tries to call an API, and on success, it dispatches a FETCH_SUCCESS action. If it catches an error, it dispatches a FETCH_FAILURE action. This setup will be used for testing error handling.
const userId = 1;
const error = new Error('An error occurred');

testSaga(fetchUserData, userId)
  .next()
  .throw(error)
  .put({ type: 'FETCH_FAILURE', error })
  .next()
  .isDone();
This test case demonstrates how to test error handling in a saga. It uses testSaga to simulate throwing an error when trying to fetch user data. The test asserts that the saga then dispatches the expected FETCH_FAILURE action with the error.