Как смоделировать долгосрочную функцию вызова с помощью redux-saga-test-plan - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть настройка Saga с большим количеством вызовов запросов, происходящих независимо друг от друга и почти одновременно.

Теперь есть один случайный случайный вызов, который должен заставить другие запросы ждать этих конкретных запросов:

Функции выглядят так:

function* requestSaga(path, options) {
     // This block has just been introduced, and I would like to test it
     while (yield isCriticalRequestRunningSelector()) {
          yield delay(...)
     }
     /// make any request
     yield call(request, options)

}


function* criticalRequest() {
    yield put(criticalRequestRunningAction())
    /// takes xxx milliseconds
    const response = yield call(requestSaga, 'critical/request/path')
    yield put(criticalRequestSuccessAction(response))
} 


function* someOtherRequest() {
    yield put(someOtherRunningAction())
    const response = yield call(requestSaga, 'some/other/request/path')
    yield put(someOtherSuccessAction(response))
}

В тесте JEST у меня есть что-то вроде этого:

describe('regular request', () => {
    it('has to wait for critical request to be finished', async () => {
        const saga = expectedSaga(<the complex saga>)
        saga.providers({
            call(effect, next) {
                if(effect.fn === request) {
                    const path = 'critical/request/path'
                    if(effect.args[0] === path) {
                        return { some: { critical: true }  }
                    } else if (effect.args[0] === path) {
                        return { some: { critical: false } }
                    }
                }
                next()
            }
        })
        saga.dispatch({type: 'CRITICAL_REQUEST_STARTED'})
        saga.dispatch({type: 'SOME_OTHER_REQUEST_STARTED'})

        /// test saga put effect other request successful
        saga.put(someOtherSuccessAction({ some: { critical: false } }))
        return saga
    })
})

Я хотел бы поставить задержку, прежде чем я верну предоставил ответ на критический запрос для тестирования сценария, где он все еще работает, когда запускается второй, но я не понимаю, почему. delay не работает, потому что он просто задерживает шаги приложения saga, что я ищу, чтобы эмулировать само время жизненного цикла запроса. Я попытался заставить провайдера звонков асинхронно c и поставить await delay штуку, прежде чем возвращать ответ, но это нарушает интерфейс.

...