Javascript 超时-在5000ms超时内未调用异步回调,因此必须显式调用done()
我目前正在为React本机应用程序编写测试,我想知道支持Redux Thunk异步方法的最佳实现Javascript 超时-在5000ms超时内未调用异步回调,因此必须显式调用done(),javascript,react-native,redux,jestjs,redux-thunk,Javascript,React Native,Redux,Jestjs,Redux Thunk,我目前正在为React本机应用程序编写测试,我想知道支持Redux Thunk异步方法的最佳实现tryLogin是一个返回调用dispatch(经典Redux thunk)的异步函数的函数。在登录过程开始时,发送LOG_USER,如果成功,则在结束时发送LOG_USER_success 问题是,如果我不明确地调用done,即使我的函数中没有很长的调用/任务(API和AsyncStorage调用被模拟),测试也不会结束。我的异步函数显示成功,然后测试将挂起,直到5000ms超时并失败 我相信我可以
tryLogin
是一个返回调用dispatch(经典Redux thunk)的异步函数的函数。在登录过程开始时,发送LOG_USER,如果成功,则在结束时发送LOG_USER_success
问题是,如果我不明确地调用done
,即使我的函数中没有很长的调用/任务(API和AsyncStorage调用被模拟),测试也不会结束。我的异步函数显示成功,然后测试将挂起,直到5000ms超时并失败
我相信我可以用async/await来代替这个实现,这对我来说更符合逻辑,但我的尝试不是很有说服力
/* @flow */
import { tryLogin } from '@actions/user'
import { LOG_USER, LOG_USER_ERROR, LOG_USER_SUCCESS } from '@constants/user'
import axios from 'axios'
import MockAdapter from 'axios-mock-adapter'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
import findTargetEnvironnmement from '@modules/findTargetEnvironnement'
const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)
const axiosMockAdapter = new MockAdapter(axios)
const store = mockStore({})
// Override user connection
jest.mock('@react-native-community/async-storage')
describe('Test user async actions', () => {
beforeEach(() => {
store.clearActions()
})
// Success Workflow test
it('should call LOG_USER_SUCCESS', done => {
const targetUrl = findTargetEnvironnmement()
if (!targetUrl) {
return done.fail(
new ReferenceError('Target environnement is not defined')
)
}
axiosMockAdapter.onPost(`${targetUrl}/session`).reply(200, {
active: true,
session_token: 'token',
})
axiosMockAdapter.onGet(`${targetUrl}/user`).reply(200, {
email: 'test@test.fr',
first_name: 'Test',
})
const expectedActions = [
{ type: LOG_USER },
{
type: LOG_USER_SUCCESS,
data: { active: true, session_token: 'token' },
infos: { email: 'test@test.fr', first_name: 'Test' },
},
]
store.dispatch(tryLogin('test@test.fr', 'testtest')).then(() => {
// return of async actions
expect.assertions(1)
expect(store.getActions()).toMatchObject(expectedActions)
done()
})
})
})
嗯。让我们尝试将
expect.assertions(1)
移动到函数顶部,并将done.fail
替换为throw
(没有什么比done.fail
,它是普通回调)。可能您只是缺少有关代码失败的错误消息。删除done.fail()
解决了我的问题!我是否需要等待我的操作tryLogin
?(这是一个返回异步函数的函数)异步函数返回承诺。您可以使用等待它,也可以将它与一起使用。然后()
链接。这取决于你。