React Native + Jest EMFILE:打开的文件错误太多

React Native + Jest EMFILE: too many open files error

我正在尝试 运行 Jest 测试,但出现以下错误:

Error reading file: /Users/mike/dev/react/TestTest/node_modules/react-native/node_modules/yeoman-environment/node_modules/globby/node_modules/glob/node_modules/path-is-absolute/package.json /Users/mike/dev/react/TestTest/node_modules/jest-cli/node_modules/node-haste/lib/loader/ResourceLoader.js:88 throw err; ^

Error: EMFILE: too many open files, open '/Users/mike/dev/react/TestTest/node_modules/react-native/node_modules/yeoman-environment/node_modules/globby/node_modules/glob/node_modules/path-is-absolute/package.json' at Error (native) npm ERR! Test failed. See above for more details.

令我感兴趣的是,错误中列出的路径指向 node_modules 目录中的一个文件,由于 testPathIgnorePatterns 中的 node_modules 条目,我预计该文件不会被读取。

我正在 运行ning Node 4.2.1,我安装 React-Native 才一周,我今天安装了 Jest(所以我想我的一切都是最新的)。我在 Mac.

我有 运行:sudo ulimit -n 10240,关闭所有终端 windows,甚至尝试重新启动。 (在我的 .bash_profile 中,我之前添加了 ulimit -n 1024。而且我尝试了更大的数字。

为了确保问题不仅仅出在我自己的项目中,我使用 react-native init TestTest 创建了一个新项目,并对 package.json:

进行了 RN 建议的更改
{
  "name": "TestTest",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node_modules/react-native/packager/packager.sh",
    "test": "jest"
  },
  "dependencies": {
    "react-native": "^0.14.1"
  },
  "jest": {
    "scriptPreprocessor": "node_modules/react-native/jestSupport/scriptPreprocess.js",
    "setupEnvScriptFile": "node_modules/react-native/jestSupport/env.js",
    "testPathIgnorePatterns": [
      "/node_modules/",
      "packager/react-packager/src/Activity/"
    ],
    "testFileExtensions": [
      "js"
    ],
    "unmockedModulePathPatterns": [
      "promise",
      "source-map"
    ]
  },
  "devDependencies": {
    "jest-cli": "^0.7.1"
  }
}

但我每次都遇到同样的错误。

我前段时间遇到过类似的问题,但无法弄清楚为什么 jest 没有忽略我的 node_modules 文件夹。

我最后做的是将 "testFileExtensions"["js"] 更改为 ["spec.js"] 并使用扩展名 .spec.js

重命名所有测试

不是正确的解决方案,但给我时间看看新版本的 jest 是否解决了这个问题

简短回答:将 'ulimit -n 4096' 添加到 ~.bash_profile 并打开一个新终端 window 解决了我的问题。

答案与我没有正确设置 ulimit 有关。

sudo ulimit -n 10240

在我的 Mac 上默默地不更改 ulimit。我本来以为它没有做任何事情,因为 10240 不是 1024 的增量。但是当我尝试 2048、4096 等时它也没有做任何事情

那么,"the" 解决方案是什么?

  • ulimit -n(没有数字)会告诉你当前值是多少
  • 对我来说,在终端中输入 sudo ulimit -n 2048 window 并没有改变 ulimit(无论我试过什么数字)
  • 将 'ulimit -n 4096' 添加到 ~.bash_profile 并打开一个新终端解决了问题

我正在 运行正在使用 Powershell windows。还使用了 Git Bash 并且有类似的问题。我更新了我的 package.json 如下:

  "devDependencies": {
    "jest-cli": "^0.8.2",
  },
  "jest": {
    "testPathDirs": ["__tests__"],
    "testPathIgnorePatterns": [
      "/node_modules/"
    ]
  },
  "scripts": {
    "test": "jest"
  },

请注意 "testPathDirs": ["__tests__"], 是我放置所有测试的目录。

现在我可以 运行 npm test 没有问题了。最终,Jest 似乎正在浏览应该排除的 /node_modules/ 目录。

我遇到了这个问题并通过 运行

修复了它
brew upgrade watchman

我在一个小的 vuejs 项目中遇到了同样的问题。在我的例子中,修复只是一个小配置 属性:我将它放入我的 jest.config.js

  watchPathIgnorePatterns: ['node_modules'],

对于与 vuejs 有同样问题的人。这是我的完整 jest.config.js 文件:

module.exports = {
  preset: '@vue/cli-plugin-unit-jest',
  transformIgnorePatterns: ['/node_modules/(?!(leaflet))'],
  watchPathIgnorePatterns: ['node_modules'],
  testMatch: [
    '<rootDir>/src/**/*.spec.js'
  ],
};