简体   繁体   中英

Jest has detected the following 1 open handle potentially keeping Jest from exiting if I use ts-jest and webpack node.js api

Trying to write a test for webpack 4 plugin, using webpack node.js API, but 1 console message haunts me.Here is a simple code for my test using jest:

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();
    });
  });
});

entry.ts :

const b = 1;

If I run this code using jest in console, it passes, bundle file is created, but a warning message is shown:

A worker process has failed to exit gracefully and has been force exited. This is likely caused by tests leaking due to improper teardown. Try running with --detectOpenHandles to find leaks.

If I run jest --detectOpenHandles, another message is shown.

Jest has detected the following 1 open handle potentially keeping Jest from exiting:

● Timeout

  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)

Looks like I am missing something but I have no ideas, what is the reason if this message, need your help. Thank you!

I believe this is because you're throwing the error but never calling the done() because the Exception isn't caught anywhere.

Before your throw statement on line 13, add a

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

After ton of experiments I found an easy decision, which helps me (500ms wasn`t enough for my environment):

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM