jfairbank / redux-saga-test-plan

Test Redux Saga with an easy plan.
http://redux-saga-test-plan.jeremyfairbank.com
MIT License
1.25k stars 127 forks source link

How to use getContext in testSaga unit test #384

Open sbitproz opened 2 years ago

sbitproz commented 2 years ago

Context

In the application we adopted Sagas to manage our side effects. We've tried to use this excellent library to improve our test readability of our tests and that the ordering of the yields are correct.

Our application provides our apis through the application using the Context API. This is where we've hit a slight speed bump in the test with getContext.

In our Sagas we're accessing the api through getContext from the redux-saga/effects package. e.g.

export function* aSaveGeneratorFunction(someAction) {
  ...
  const { payload: { someEntity } } = someAction
  const entityApi = yield getContext("entity")
  ....
 const responseFromApi = yield call([entityApi, `saveSomeEntity`], someEntity)
  ...
}

In our tests we're trying to mock this dependency


  it('should invoke effects in the right order', () => {
    const payload = { id: "id" }
    const action = { type: "entity/saveEntityRequest", payload }

    const saveSomeEntity = () => {
      return Promise.resolve([]);
    }

    getContext.mockImplementation((key: string) => ({
      entity: { saveSomeEntity }
    }))

    return testSaga(aSaveGeneratorFunction, action)
      ...
      .next()
      .getContext('entity')
      .next()
      ...
      .isDone();
  })

Our generator function fails to execute the mock function provided through the getContext.

  1. Are we using getContext in the correct way?
  2. Is there a particular way to mock getContext when using testSaga? (current this mocking works in expectSaga)
  3. Do you have any recommendations of how to approach this test?
jp928 commented 2 years ago

@sbitproz Thanks for using this library. Unfortunately, testSaga doesn't support mock getContext, but feel free to try use jest.mock() instead. The way to test getContext is using expectSaga, see this PR: https://github.com/jfairbank/redux-saga-test-plan/pull/179/files

Also, feel free to propose your opinion to improve this.

sbitproz commented 2 years ago

Hi @jp928

Thanks for the efficient reply. Is it worth adding a detail about this on the documentation?