使用 React、Jest、Redux 和 Thunk 进行无限循环测试
Infinite Loop in Test with React, Jest, Redux and Thunk
我有一个带有 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 编辑的完成处理程序 return 等待 store.dispatch 编辑的承诺完成。但是,承诺永远不会执行,测试进入无限循环,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.
起初我以为我的自定义异步操作生成器 returned 的承诺有问题,但请注意它是如何 returning 来自 Firebase 的承诺(查看内部 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 进入无限循环。预先感谢您的帮助。
Assertion failed: new_time >= loop->time, file
c:\ws\deps\uv\src\win\core.c, line 309 error Command failed with exit
code 3221226505.
这似乎是在系统时钟漂移时发生的。您可以尝试以下任一方法来解决它:
- 在 Windows 10.
的日期和时间设置下同步您的时钟
或
- 选择不同的时钟源,例如ACPI 而不是 TSC ,或者通过调整 BIOS 中的设置。
或
- 正在对您的系统进行 CMOS 重置。
或
- 检查您的板载 CMOS 备用电池
或
- 安装 WSL(Windows Linux 的子系统)。此解决方法适用于许多人
或
- 或卸载/重新安装 Node 和 libuv/更新到最新版本,以受益于针对特定代处理器的任何修复。
所以我在 Google) 上偶然发现了 this lengthy issue on Github (keywords 'Assertion failed: new_time >= loop->time',约会将近三年前。它是 (libuv) Node 用于其异步 I/O 的库,也是问题所在的地方。简短阅读后,该问题似乎只存在于 Intel 的 Ice Lake CPU's(目前)。虽然该问题已在库中修复,但它需要至少 14.6.0 的 Node 版本,其中包括修复的库实现。建议更新到此版本(可能是最简单的选择,但不是唯一的选择)。
我有一个带有 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 编辑的完成处理程序 return 等待 store.dispatch 编辑的承诺完成。但是,承诺永远不会执行,测试进入无限循环,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.
起初我以为我的自定义异步操作生成器 returned 的承诺有问题,但请注意它是如何 returning 来自 Firebase 的承诺(查看内部 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 进入无限循环。预先感谢您的帮助。
Assertion failed: new_time >= loop->time, file c:\ws\deps\uv\src\win\core.c, line 309 error Command failed with exit code 3221226505.
这似乎是在系统时钟漂移时发生的。您可以尝试以下任一方法来解决它:
- 在 Windows 10. 的日期和时间设置下同步您的时钟
或
- 选择不同的时钟源,例如ACPI 而不是 TSC ,或者通过调整 BIOS 中的设置。
或
- 正在对您的系统进行 CMOS 重置。
或
- 检查您的板载 CMOS 备用电池
或
- 安装 WSL(Windows Linux 的子系统)。此解决方法适用于许多人
或
- 或卸载/重新安装 Node 和 libuv/更新到最新版本,以受益于针对特定代处理器的任何修复。
所以我在 Google) 上偶然发现了 this lengthy issue on Github (keywords 'Assertion failed: new_time >= loop->time',约会将近三年前。它是 (libuv) Node 用于其异步 I/O 的库,也是问题所在的地方。简短阅读后,该问题似乎只存在于 Intel 的 Ice Lake CPU's(目前)。虽然该问题已在库中修复,但它需要至少 14.6.0 的 Node 版本,其中包括修复的库实现。建议更新到此版本(可能是最简单的选择,但不是唯一的选择)。