如果我使用ts-Jest和webpack node.js api,Jest检测到以下1个打开的句柄可能会阻止Jest退出



试图使用webpack node.js API为webpack 4插件编写测试,但1个控制台消息困扰着我

webpack4.test.ts:

import path from 'path';
import webpack from 'webpack';
describe('webpack', () => {
test('should pass with simplest config', (done) => {
const compiler = webpack({
mode: 'none',
entry: path.resolve(__dirname, 'entry.ts'),
});
compiler.run((err, stats) => {
if (err) {
throw new Error(err.message);
}
expect(2).toBe(2);
done();
});
});
});

条目.ts

const b = 1;

如果我在控制台中使用jest运行此代码,它通过了,创建了捆绑文件,但显示了一条警告消息:

工作进程未能正常退出,已被强制退出。这可能是由于拆卸不当导致的测试泄漏造成的。尝试使用--detectOpenHandles运行以查找泄漏。

如果我运行jest--detectOpenHandles,将显示另一条消息。

Jest检测到以下1个打开的句柄可能阻止Jest退出:

●超时

12 |       if (err) {
13 |         throw new Error(err.message);
> 14 |       }
|        ^
15 |
16 |       expect(2).toBe(2);
17 |       done();
at go$readFile (node_modules/graceful-fs/graceful-fs.js:118:14)
at Object.readFile (node_modules/graceful-fs/graceful-fs.js:115:12)
at Storage.provide (node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:90:3)
at CachedInputFileSystem.readFile (node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:269:25)
at CachedInputFileSystem._readJson (node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:223:10)
at Storage.provide (node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:90:3)
at CachedInputFileSystem.readJson (node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:273:25)
at node_modules/enhanced-resolve/lib/DescriptionFileUtils.js:22:26
at forEachBail (node_modules/enhanced-resolve/lib/forEachBail.js:14:3)
at findDescriptionFile (node_modules/enhanced-resolve/lib/DescriptionFileUtils.js:17:3)
at Object.loadDescriptionFile (node_modules/enhanced-resolve/lib/DescriptionFileUtils.js:74:4)
at node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js:24:27
at AsyncSeriesBailHook.eval [as callAsync] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:22:1)
at AsyncSeriesBailHook.lazyCompileHook (node_modules/tapable/lib/Hook.js:154:20)
at Resolver.doResolve (node_modules/enhanced-resolve/lib/Resolver.js:282:16)
at node_modules/enhanced-resolve/lib/ParsePlugin.js:28:14
at AsyncSeriesBailHook.eval [as callAsync] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:7:1)
at AsyncSeriesBailHook.lazyCompileHook (node_modules/tapable/lib/Hook.js:154:20)
at Resolver.doResolve (node_modules/enhanced-resolve/lib/Resolver.js:282:16)
at node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js:36:14
at AsyncSeriesBailHook.eval [as callAsync] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:7:1)
at AsyncSeriesBailHook.lazyCompileHook (node_modules/tapable/lib/Hook.js:154:20)
at Resolver.doResolve (node_modules/enhanced-resolve/lib/Resolver.js:282:16)
at Resolver.resolve (node_modules/enhanced-resolve/lib/Resolver.js:170:15)
at Array.<anonymous> (node_modules/webpack/lib/NormalModuleFactory.js:208:22)
at arrayEachFunc (node_modules/neo-async/async.js:2517:19)
at Object.parallel (node_modules/neo-async/async.js:6858:9)
at node_modules/webpack/lib/NormalModuleFactory.js:191:13
at node_modules/webpack/lib/NormalModuleFactory.js:129:4
at node_modules/webpack/lib/NormalModuleFactory.js:400:5
at AsyncSeriesWaterfallHook.eval [as callAsync] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1)
at AsyncSeriesWaterfallHook.lazyCompileHook (node_modules/tapable/lib/Hook.js:154:20)
at NormalModuleFactory.create (node_modules/webpack/lib/NormalModuleFactory.js:381:28)
at node_modules/webpack/lib/Compilation.js:1063:18
at Semaphore.acquire (node_modules/webpack/lib/util/Semaphore.js:29:4)
at Compilation._addModuleChain (node_modules/webpack/lib/Compilation.js:1062:18)
at Compilation.addEntry (node_modules/webpack/lib/Compilation.js:1164:8)
at node_modules/webpack/lib/SingleEntryPlugin.js:46:17
at AsyncParallelHook.eval [as callAsync] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:7:1)
at AsyncParallelHook.lazyCompileHook (node_modules/tapable/lib/Hook.js:154:20)
at node_modules/webpack/lib/Compiler.js:669:20
at AsyncSeriesHook.eval [as callAsync] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1)
at AsyncSeriesHook.lazyCompileHook (node_modules/tapable/lib/Hook.js:154:20)
at Compiler.compile (node_modules/webpack/lib/Compiler.js:662:28)
at node_modules/webpack/lib/Compiler.js:321:11
at Compiler.readRecords (node_modules/webpack/lib/Compiler.js:529:11)
at node_modules/webpack/lib/Compiler.js:318:10
at AsyncSeriesHook.eval [as callAsync] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:6:1)
at AsyncSeriesHook.lazyCompileHook (node_modules/tapable/lib/Hook.js:154:20)
at node_modules/webpack/lib/Compiler.js:315:19
at AsyncSeriesHook.eval [as callAsync] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:15:1)
at AsyncSeriesHook.lazyCompileHook (node_modules/tapable/lib/Hook.js:154:20)
at Compiler.run (node_modules/webpack/lib/Compiler.js:312:24)
at Object.<anonymous> (test/plugins/webpack4.test.ts:14:18)

看起来我错过了什么,但我不知道,如果这条消息需要你的帮助,原因是什么。非常感谢。

我相信这是因为您抛出了错误,但从未调用done(),因为在任何地方都没有捕捉到异常。

在第13行的throw语句之前,添加一个

fail('compiler.run() failed')
done()

经过大量的实验,我发现了一个简单的决定,这对我有帮助(500毫秒对我的环境来说不够(:

afterAll(async () => {
// avoid jest open handle error
await new Promise(resolve => setTimeout(() => resolve(''), 1000));
});

最新更新