Я пытаюсь проверить свои функции redux-saga с помощью Redux Saga Test Plan библиотеки, и я застрял из-за задержек функций в моей саге.
Если я уберу строку, yield delay(1000)
все тесты пройдут без ошибок.
saga.js
export function* addWorkoutSaga({ payload }) {
try {
yield put(beginAjaxCall());
yield delay(1000);
yield call(WorkoutService.add, payload);
yield call(toast.success, "Item added successfully.");
yield put(closeModal(Modal.AddWorkout));
yield put(addWorkout.success());
yield call(fetchWorkoutsSaga);
}
catch (error) {
console.log(error)
yield put(addWorkout.failure({ errorMessage: error.statusText }));
yield call(toast.error, "Error occured. Please try again.");
}
}
saga.test.js
import {
call,
put,
//takeLatest,
delay
} from 'redux-saga/effects';
import * as matchers from 'redux-saga-test-plan/matchers';
import { expectSaga } from 'redux-saga-test-plan';
import { throwError } from 'redux-saga-test-plan/providers';
import {
fetchWorkouts,
addWorkout,
//editWorkout,
deleteWorkout
} from '../../actions/workoutApiActionsForSaga';
import { WorkoutService } from "../../services";
import {
fetchWorkoutsSaga,
deleteWorkoutSaga,
addWorkoutSaga
} from '../workouts.saga'
describe('testing Workouts Sagas with redux-saga-test-plan', () => {
const fakeAddPayload = {
payload: {
id: '6e8dbbc8-233f-41b1-ade3-ca568b35918c',
date: '2019-05-27T18:10:35.282Z',
workoutType: 'Running',
calories: 100
}
};
const errorToThrow = {
statusText: 'custom Error Message'
};
it('should call addWorkoutSaga function', () => {
return expectSaga(addWorkoutSaga, fakeAddPayload)
.provide([
[matchers.call.fn(delay), null],
[matchers.call.fn(WorkoutService.add), null],
[matchers.call.fn(fetchWorkoutsSaga), null]
])
.call(WorkoutService.add, fakeAddPayload.payload)
.put(addWorkout.success())
.call(fetchWorkoutsSaga)
.run();
});
});
Когда я запустил тест, я получил следующую ошибку, потому что ожидаемое значение не равно фактическому значению.
Expected
--------
{ '@@redux-saga/IO': true,
combinator: false,
type: 'CALL',
payload:
{ context: null,
fn: [Function: add],
args:
[ { id: '6e8dbbc8-233f-41b1-ade3-ca568b35918c',
date: '2019-05-27T18:10:35.282Z',
workoutType: 'Running',
calories: 100 } ] } }
Actual:
------
1. { '@@redux-saga/IO': true,
combinator: false,
type: 'CALL',
payload: { context: null, fn: [Function: delayP], args: [ 1000 ] } }
at new SagaTestError (node_modules/redux-saga-test-plan/lib/shared/SagaTestError.js:17:57)
at node_modules/redux-saga-test-plan/lib/expectSaga/expectations.js:67:13
at node_modules/redux-saga-test-plan/lib/expectSaga/index.js:563:7
at Array.forEach (<anonymous>)
at checkExpectations (node_modules/redux-saga-test-plan/lib/expectSaga/index.js:562:18)
Мне кажется, что ошибка связана с функцией delay
. Когда я пытался изменить функцию задержки на yield call(delay, 1000)
, она выдает эту ошибку
Error: instead of writing `yield call(delay, 1000)` where delay is an effect from `redux-saga/effects` you should write `yield delay(1000)`
Если я изменил строку на yield call(delay(1000));
, она показала следующую другую ошибку
Error: call: argument of type {context, fn} has undefined or null `fn`
Не могли бы вы помочь мне, как я мог проверить свою сагу с задержками? Я не хочу удалять операторы задержки в коде, чтобы тесты проходили успешно.