使用React,Jest,Redux和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返回的完成处理程序来等待,直到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进入无限循环。预先感谢您的帮助。

解决方法

所以我偶然发现了Github上的this lengthy issue(Google上的关键字“ Assertion failed: new_time >= loop->time”),距今大约三年前。它是(libuv)Node用于其异步I / O的库,也是问题所在的地方。简短阅读后,该问题似乎仅存在于英特尔的Ice Lake CPU上(目前)。虽然该问题已在库中解决,但它要求Node版本至少为14.6.0,其中包括已修复的库实现。建议将其更新到此版本(可能是最简单的选择,但不是唯一选择)。

,

断言失败:new_time> = loop->时间,文件 c:\ ws \ deps \ uv \ src \ win \ core.c,第309行错误命令失败,退出 代码3221226505。

这似乎在系统时钟漂移时发生。您可以尝试以下任何一种方法来解决它:

  1. 在Windows 10的“日期和时间设置”下同步时钟。

  1. 选择其他时钟源,例如ACPI代替TSC,或者通过调整BIOS中的设置。

  1. 在系统上进行CMOS重置。

  1. 检查板载CMOS备用电池

  1. 安装WSL (Linux的Windows子系统)。这种解决方法适用于许多人

  1. 或卸载/重新安装Node并libuv /更新到最新版本,以受益于特定代处理器的任何修复程序。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...