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

Posted

技术标签:

【中文标题】React Native + Jest EMFILE:打开文件过多错误【英文标题】:React Native + Jest EMFILE: too many open files error 【发布时间】:2016-02-08 23:00:39 【问题描述】:

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

错误读取文件:/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 抛出错误; ^

错误:EMFILE:打开的文件太多,打开 '/Users/mike/dev/react/TestTest/node_modules/react-native/node_modules/yeoman-environment/node_modules/globby/node_modules/glob/node_modules/path-is -绝对/package.json' 在错误(本机) npm 错误!测试失败。有关详细信息,请参见上文。

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

我正在运行 Node 4.2.1,我安装的 React-Native 才一周前,我今天安装了 Jest(所以我想我已经掌握了一切)。我在 Mac 上。

我已经运行:sudo ulimit -n 10240,关闭了所有终端窗口,甚至尝试重新启动。 (在我的 .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"
  

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

【问题讨论】:

在尝试了其他选项后,根据此论坛帖子bountysource.com/issues/…,我最终使用brew install watchman 取得了成功 【参考方案1】:

我在一个小型 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'
  ],
;

【讨论】:

太棒了!像魅力一样工作 这个对我有用,在我配备 M1 CPU 的新 MacBook Air 上。 也适用于NextJS 应用程序(MacOS、Intel) 此解决方案适用于 mac - NodeJS 16 环境/ExpressJS 框架【参考方案2】:

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

brew upgrade watchman

【讨论】:

【参考方案3】:

我在 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/ 目录。

【讨论】:

这解决了我的问题。对于使用 react-scripts(创建 react 应用程序)的任何人,您必须将“testPathIgnorePatterns”替换为“watchPathIgnorePatterns”。 谢谢先生!这实际上解决了问题而不是躲避它。对于 CRA,只需更改 jest 选项 watchPathIgnorePatterns: ['/node_module/'] 即可修复它。 Jest 在 node_modules 内运行测试。安装 watchman 并不能解决它只是通过使用资源和减慢测试来开玩笑【参考方案4】:

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

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

sudo ulimit -n 10240

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

那么,什么是“解决方案”?

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

【讨论】:

如果您删除 sudo 并调用 ulimit -n 10240 它应该可以在 OSX 上运行【参考方案5】:

前段时间我遇到过类似的问题,但不明白为什么 jest 没有忽略我的 node_modules 文件夹。

我最终做的是将 "testFileExtensions"["js"] 更改为 ["spec.js"] 并使用扩展名 .spec.js 重命名所有测试

不是正确的解决方案,但让我有时间看看新版本的 jest 是否能解决此问题

【讨论】:

这是一个很好的建议,但它并没有为我解决问题。但它所做的是消除了一个很大的可能性,这导致我追求其他可能的原因(我最终找到了,见我上面的答案)。谢谢!

以上是关于React Native + Jest EMFILE:打开文件过多错误的主要内容,如果未能解决你的问题,请参考以下文章

React Native Expo - Jest - React Native Firebase - Invariant Violation:Native 模块不能为空

react-native, jest, ts-jest: ReferenceError: React is not defined

Jest 在 react-native-modalize 上失败了?

NativeBase 内容未在 Jest 中使用 react-native-testing-library 呈现

使用 Jest 在 React-Native 中测试组件行为(点击)

使用 Jest 运行 testing-library/react-native 时 RNEncryptedStorage 未定义