Javascript 超时-在5000ms超时内未调用异步回调,因此必须显式调用done()

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超时并失败 我相信我可以

我目前正在为React本机应用程序编写测试,我想知道支持Redux Thunk异步方法的最佳实现
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
?(这是一个返回异步函数的函数)异步函数返回承诺。您可以使用
等待它,也可以将它与
一起使用。然后()
链接。这取决于你。