У меня есть настройка 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
штуку, прежде чем возвращать ответ, но это нарушает интерфейс.