React项目运行npm test时App.test.js出现EMFILE错误求助
嘿,我看到你在运行npm test时碰到了FSEvents注册失败和EMFILE的报错,这在macOS环境下算是比较常见的问题,咱们一步步来搞定它:
错误原因分析
首先,EMFILE错误本质是系统打开的文件描述符数量达到上限了,而FSEvents的register_with_server: ERROR是这个问题引发的连锁反应——Jest需要监听项目文件的变化来自动重跑测试,当打开的文件数超过系统限制时,就会触发这个报错。
具体解决步骤
临时提升文件描述符上限
先在终端里执行这条命令临时调整:ulimit -n 10240然后重新运行
npm test,看看能不能正常工作。注意这是临时生效的,重启终端后会恢复默认值。永久设置文件描述符上限
如果临时调整有效,咱们把这个设置永久化:- 打开你的shell配置文件(比如
~/.bash_profile,如果用zsh就是~/.zshrc) - 添加一行:
ulimit -n 10240 - 保存后执行
source ~/.bash_profile(对应你的配置文件名)让设置生效。
- 打开你的shell配置文件(比如
安装Watchman优化文件监听
React官方推荐用Watchman来替代Node原生的文件监听,它能更高效地处理文件变化,减少文件描述符的占用。用Homebrew安装:brew install watchman安装完成后重启你的测试命令试试。
清理依赖缓存并重装
有时候依赖缓存或版本冲突也会引发奇怪的问题,执行以下步骤重置依赖:rm -rf node_modules npm cache clean --force npm install优化Jest配置,减少监听负载
在你的package.json里添加Jest配置,忽略不需要监听的目录(比如node_modules),减少需要监控的文件数量:"jest": { "watchPathIgnorePatterns": [ "<rootDir>/node_modules/" ] }
额外优化建议
看了你的package.json,发现你单独安装了babel-jest和jest,但实际上react-scripts已经内置了适配好的Jest和Babel相关依赖,单独安装可能会导致版本冲突,建议把这两个从dependencies里移除,然后重新安装依赖。
你的App.test.js代码本身没有问题,这个错误是环境层面的,按照上面的步骤处理后应该就能正常运行测试了。
内容的提问来源于stack exchange,提问作者Fille_M

