如何测试 react-saga axios post
how to test react-saga axios post
我正在学习如何测试并使用一些示例作为指导,我正在尝试模拟登录 post。该示例使用 fetch 进行 http 调用,但我使用 axios。这是我收到的错误
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL
此错误的所有答案都与获取有关,我如何使用 axios 执行此操作
./saga
const encoder = credentials => Object.keys(credentials).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(credentials[key])}`).join('&')
const postLogin = credentials => {
credentials.grant_type = 'password'
const payload = {
method: 'post',
headers: config.LOGIN_HEADERS,
data: encoder(credentials),
url: `${config.IDENTITY_URL}/Token`
}
return axios(payload)
}
function * loginRequest (action) {
try {
const res = yield call(postLogin, action.credentials)
utils.storeSessionData(res.data)
yield put({ type: types.LOGIN_SUCCESS, data: res.data })
} catch (err) {
yield put({ type: types.LOGIN_FAILURE, err })
}
}
function * loginSaga () {
yield takeLatest(types.LOGIN_REQUEST, loginRequest)
}
export default loginSaga
./登录测试
const loginReply = {
isAuthenticating: false,
isAuthenticated: true,
email: 'foo@yahoo.com',
token: 'access-token',
userId: '1234F56',
name: 'Jane Doe',
title: 'Tester',
phoneNumber: '123-456-7890',
picture: 'pic-url',
marketIds: [1, 2, 3]
}
describe('login-saga', () => {
it('login identity user', async (done) => {
// Setup Nock
nock(config.IDENTITY_URL)
.post('/Token', { userName: 'xxx@xxx.com', password: 'xxxxx' })
.reply(200, loginReply)
// Start up the saga tester
const sagaTester = new SagaTester({})
sagaTester.start(loginSaga)
// Dispatch the event to start the saga
sagaTester.dispatch({type: types.LOGIN_REQUEST})
// Hook into the success action
await sagaTester.waitFor(types.LOGIN_SUCCESS)
// Check the resulting action
expect(sagaTester.getLatestCalledAction()).to.deep.equal({
type: types.LOGIN_SUCCESS,
payload: loginReply
})
})
})
因为你的 nock
模拟中有 specified a body ({ userName: 'xxx@xxx.com', password: 'xxxxx' }
),它不会响应 loginReply
直到它收到 post 请求都给出 URL 和正文。但是你不发送 credentials
和你的 LOGIN_REQUEST
动作,因此你的 axios 请求正文( payload.data
)总是空的。这就是为什么你的 nock
模拟没有在指定的异步超时内回复并且 jest
给出这个超时错误。
要解决此问题,您要么必须在 nock
设置中删除指定的正文,要么使用凭据分派 LOGIN_REQUEST
操作并更改指定的正文以匹配您设置为 [=20= 的编码凭据].
您收到以下错误:Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL
因为您没有在测试中调用 done
回调。
我正在学习如何测试并使用一些示例作为指导,我正在尝试模拟登录 post。该示例使用 fetch 进行 http 调用,但我使用 axios。这是我收到的错误
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL
此错误的所有答案都与获取有关,我如何使用 axios 执行此操作
./saga
const encoder = credentials => Object.keys(credentials).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(credentials[key])}`).join('&')
const postLogin = credentials => {
credentials.grant_type = 'password'
const payload = {
method: 'post',
headers: config.LOGIN_HEADERS,
data: encoder(credentials),
url: `${config.IDENTITY_URL}/Token`
}
return axios(payload)
}
function * loginRequest (action) {
try {
const res = yield call(postLogin, action.credentials)
utils.storeSessionData(res.data)
yield put({ type: types.LOGIN_SUCCESS, data: res.data })
} catch (err) {
yield put({ type: types.LOGIN_FAILURE, err })
}
}
function * loginSaga () {
yield takeLatest(types.LOGIN_REQUEST, loginRequest)
}
export default loginSaga
./登录测试
const loginReply = {
isAuthenticating: false,
isAuthenticated: true,
email: 'foo@yahoo.com',
token: 'access-token',
userId: '1234F56',
name: 'Jane Doe',
title: 'Tester',
phoneNumber: '123-456-7890',
picture: 'pic-url',
marketIds: [1, 2, 3]
}
describe('login-saga', () => {
it('login identity user', async (done) => {
// Setup Nock
nock(config.IDENTITY_URL)
.post('/Token', { userName: 'xxx@xxx.com', password: 'xxxxx' })
.reply(200, loginReply)
// Start up the saga tester
const sagaTester = new SagaTester({})
sagaTester.start(loginSaga)
// Dispatch the event to start the saga
sagaTester.dispatch({type: types.LOGIN_REQUEST})
// Hook into the success action
await sagaTester.waitFor(types.LOGIN_SUCCESS)
// Check the resulting action
expect(sagaTester.getLatestCalledAction()).to.deep.equal({
type: types.LOGIN_SUCCESS,
payload: loginReply
})
})
})
因为你的 nock
模拟中有 specified a body ({ userName: 'xxx@xxx.com', password: 'xxxxx' }
),它不会响应 loginReply
直到它收到 post 请求都给出 URL 和正文。但是你不发送 credentials
和你的 LOGIN_REQUEST
动作,因此你的 axios 请求正文( payload.data
)总是空的。这就是为什么你的 nock
模拟没有在指定的异步超时内回复并且 jest
给出这个超时错误。
要解决此问题,您要么必须在 nock
设置中删除指定的正文,要么使用凭据分派 LOGIN_REQUEST
操作并更改指定的正文以匹配您设置为 [=20= 的编码凭据].
您收到以下错误:Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL
因为您没有在测试中调用 done
回调。