3

Inside my saga, I call an api request.

function* sendRequestSaga(): SagaIterator {
    yield takeEvery(Actions.sendRequest.type, sendApiRequest);
}

function* sendApiRequest(action: Action<string>) {
    try {
        yield call(/*args for calling api*/);
    } catch (error) {
        // Handle error
    }
}

I have created unit test for the success case. Now I want to create an unit test for the case that call api returns an exception.

it("Should handle exception correctly", () => {
    const expectedException = new Error("my expecting exception");
    return expectSaga(mySaga)
        .provide([
            [call(/*args for calling api*/), expectedException],
        ])
        .call(/*args for calling api*/)
        .dispatch({
            type: Actions.sendRequest.type,
            payload: /*args*/
        })
        .silentRun()
        .then(() => {
            // My assertion
        });
}

But this is not working cause provide only return a value for call method instead of throwing a new Error object. So, Error object is not caught. How can I simulate a throw Error action?

Tera Mind
  • 263
  • 4
  • 17

1 Answers1

4

It turns out can be achieved by throwError() from redux-saga-test-plan

import { throwError } from "redux-saga-test-plan/providers";

it("Should handle exception correctly", () => {
    const expectedException = new Error("my expecting exception");
    return expectSaga(mySaga)
        .provide([
            [call(/*args for calling api*/), throwError(expectedException)],
        ])
        .call(/*args for calling api*/)
        .dispatch({
            type: Actions.sendRequest.type,
            payload: /*args*/
        })
        .silentRun()
        .then(() => {
            // My assertion
        });
}
Tera Mind
  • 263
  • 4
  • 17