Получил ошибку при тестировании redux-saga с функциями задержки с помощью библиотеки Redux Saga Test Plan

Я пытаюсь протестировать свои функции редукционной саги, используя библиотеку План тестирования Redux Saga, и я застрял из-за функций задержки в моей саге.

Если убрать строку, yield delay(1000) все тесты пройдут без ошибок.

сага.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.info(error)
        yield put(addWorkout.failure({ errorMessage: error.statusText }));
        yield call(toast.error, "Error occured.  Please try again.");
    }
}

сага.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`

Не могли бы вы помочь мне, как я могу проверить свою сагу с задержками? Я не хочу удалять операторы задержки в коде, чтобы тесты прошли.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
2 295
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете просто издеваться над call, который delay использует под капотом.

Как описано более подробно здесь: https://github.com/jfairbank/redux-saga-test-plan/issues/257

Вот как я это сделал. Я должен проверить 'delayP' или нет. В противном случае он издевается над каждым вызовом моего метода *Saga(). github.com/ttcg/react-workout-diary/blob/…

TTCG 01.06.2019 11:48

Другие вопросы по теме

Как использовать модель в одном корне в reactjs?
Как исправить поисковый фильтр React, который не обновляется при возврате
Реагировать - event.target возвращает innerText ранее щелкнутого элемента вместо текущего щелкнутого элемента
Реагировать на проблему с параметрами маршрутизатора dom
Как вызвать обратный вызов, предоставленный свойством рендеринга, из его родительского компонента, используя хуки между рендерингами
Неверный вызов ловушки. Хуки можно вызывать только внутри тела функционального компонента при применении стиля к базовому компоненту класса с помощью material-ui
Автоматически изменять размер выпадающего списка css, чтобы он соответствовал самому большому элементу
Firebase intellisense/автодополнение в проекте JavaScript React в VSCode
Как заставить onClick и href работать вместе?
AWS ELB возвращает 404 для https://domain_name:8000, но доступен через public_ip:8000