gpt4 book ai didi

unit-testing - 单元测试 redux-saga 任务取消

转载 作者:行者123 更新时间:2023-12-04 04:09:42 25 4
gpt4 key购买 nike

我想知道是否有人对如何对以下 redux-saga 登录/注销流程进行单元测试有任何提示:

let pollingTask = null

function * handleLogin () {
try {
const token = yield call(loginHandler)
pollingTask = yield fork(handlePolls, token)
yield put('LOGIN_SUCCSES')
} catch (e) {
yield put('LOGIN_FAILURE')
}
}

function * handlePolls (token) {
while (true) {
try {
yield call(pollHandler, token)
yield put('POLL_SUCCESS')
} catch (e) {
yield put('POLL_FAILURE')
} finally {
if (yield cancelled()) {
yield call(pollCancelled)
}
}
}
}

function * handleLogout () {
try {
yield call(logoutHandler)
yield cancel(pollingTask)
yield put('LOGOUT_SUCCESS')
} catch (e) {
yield put('LOGOUT_FAILURE')
}
}

由于我需要取消 pollingTask注销时,我尝试使用 createMockTask()在我的测试中,但我总是得到它的值 undefined当我调用 handleLogout()传奇,虽然我知道我的 handleLogin()将始终首先启动并初始化 pollingTask .

任何帮助将非常感激!

最佳答案

为了让函数去 yield cancelled() 你在迭代器上调用 .return() 。

一个例子 -

//assuming this saga 
function* saga() {
try {
const resp = yield call(someApi)
yield put(action(resp))
} finally {
if(yield cancelled()) {
// handle logic specific to cancellation. For example
yield <some effect>
}
}
}

// test
const gen = saga()
expect(gen.next().value).toEqual(call(someApi))
// simulates cancellation
// gen asking for cancel status
expect(gen.return().value).toEqual( cancelled() )
// answer yes, we've been cancelled
expect(gen.next(true).value).toEqual(<some effect>)

示例取自 https://github.com/redux-saga/redux-saga/issues/266#issuecomment-216087030

关于unit-testing - 单元测试 redux-saga 任务取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46166401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com