Как проверить этот код Redux Saga с помощью Jest? - PullRequest
0 голосов
/ 21 марта 2020

В прошлом мы использовали Redux Thunk, который было проще тестировать. После преобразования в Redux-Saga это выглядит так:

import { takeLatest, put } from "redux-saga/effects";
function* fetchTasksSaga(){
 try {
const taskResponse = yield fetch("API URL")
const tasks = yield taskResponse.json()
yield put(fetchTasksSuccess(tasks));
} catch (error) {
yield put(fetchTasksError(error.message));
  }
}
export default function* watchFetchTasksSaga(){
    yield takeLatest("FETCH_TASKS_START", fetchTasksSaga)
}

Как это будет выглядеть как шутник для этого фрагмента?

1 Ответ

0 голосов
/ 21 марта 2020

Это будет выглядеть примерно так:

describe('saga testing watchFetchTasksSaga', () => {
   it('should test watchFetchTasksSaga', () => {
     const gen = watchFetchTasksSaga();
     expect(gen.next().value).toEqual(takeLatest("FETCH_TASKS_START", fetchTasksSaga));
        });
});

describe('test fetchTasksSaga', () => {
    const gen = cloneableGenerator(fetchTasksSaga)();
    expect(gen.next().value).toEqual(fetch("API URL"));

    it('test fetchTasksSaga success scenario', () => {
      const gen1 = gen.clone();
      const data = '2cd09fe0-3b6f-11ea-b05a-3b06a24be1d6';
      const response = { data };
      expect(gen1.next(response).value).toEqual(response.json());
      expect(gen1.next().value).toEqual(
        put(fetchTasksSuccess(tasks)),
      );
      expect(gen1.next().done).toBe(true);
    });

    it('should test error scenario', () => {
      const gen1 = gen.clone();
      const error = {
        message: 'some error',
      };
      expect(gen1.throw(error).value).toEqual(
        put(fetchTasksError(error.message)),
      );
    });
  });

Ссылка: https://redux-saga.js.org/docs/advanced/Testing.html

...