【发布时间】:2020-12-03 17:12:16
【问题描述】:
我有一个带有 Jest 测试套件的 React 应用程序。应用程序使用 redux,测试套件使用 redux-mock-store。我正在使用 react-thunk 中间件来延迟调度操作,因为应用程序需要与远程 Firebase 数据库同步数据。我希望我的测试套件在向 Redux 发送操作后验证某些条件,如下所示:
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
// This is my custom async action generator.
import { asyncAction } from './some/path';
const createMockStore = configureMockStore([thunk]);
test("Test", (done) => {
const store = createMockStore({});
const data = { ... };
store.dispatch(asyncAction(data)).then(() => {
expect(someCondition);
done();
});
});
测试使用 Jest 返回的 done 处理程序等待 store.dispatch 返回的承诺完成。但是,promise 从未执行,测试进入无限循环,Jest 失败并出现以下异常:
Assertion failed: new_time >= loop->time, file c:\ws\deps\uv\src\win\core.c, line 309
error Command failed with exit code 3221226505.
一开始我以为我的自定义异步动作生成器返回的promise有问题,但是注意它是如何从Firebase返回一个promise的(看内部的return语句,外部的return语句是redux调度的函数-thunk):
import database from '../firebase/firebase';
export const asyncAction = (data = {}) => {
return (dispatch) => {
return database.ref('someCollection').push(data).then((ref) => {
dispatch({ type: 'SOME_TYPE', id: ref.key, ...data });
});
};
};
然后我想我设置 Firebase 的方式可能有问题,但我已经验证了应用程序和测试套件都成功地保存了数据。这是 Firebase 配置:
import * as firebase from 'firebase/app';
import 'firebase/database';
firebase.initializeApp({ ... });
const database = firebase.database();
export { database as default };
然后我认为可能是 Redux 或 redux-thunk 中间件有问题,但我已经验证应用程序正在成功保存数据。这是我的 Redux 配置:
import { applyMiddleware, createStore, combineReducers, compose } from 'redux';
import thunk from 'redux-thunk';
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
export default () => {
const reducer = combineReducers({ ... });
const enhancer = composeEnhancers(applyMiddleware(thunk));
return createStore(reducer, enhancer);
};
我觉得这一切都很好。我无法确定是什么导致 Jest 进入无限循环。提前感谢您的帮助。
【问题讨论】:
-
你在哪里模拟
database对象? -
你在节点 >= 14.6.0 上吗? (它包含对 Ice Lake cpu 的 libuv 的修复)
-
@Ishank:那个特定的测试是一个集成测试,所以它故意使用实际的 Fireabase 数据库。
-
@Caramiriel:很好的建议!事实证明,我使用的是 Ice Lake CPU 和旧版本的 Node.js。升级到最新版本(撰写本文时为 14.8.0)解决了这个问题。我认为我的测试没有那么复杂,因此在 Jest 中处理异步逻辑肯定存在更大的问题,导致 Node 进入无限循环。如果您想要赏金,请写下答案,我会将其标记为已接受。谢谢!
标签: reactjs firebase react-redux jestjs redux-thunk