Angular 4单元测试无法运行求助:Chrome控制台fs.existsSync报错
fs.existsSync is not a function的报错 我之前在做Angular项目单元测试时也碰到过一模一样的问题,这个错误的根源很明确:fs是Node.js专属的文件系统模块,浏览器环境(这里就是Chrome)根本没有这个API,而你的测试打包过程里不小心把依赖了fs的selenium-webdriver模块给塞进了浏览器代码里,自然就会报错。
给你几个可行的解决步骤:
检查测试代码,移除不必要的selenium导入
先看看你的单元测试文件里,有没有误导入selenium-webdriver相关的代码?单元测试应该用Angular自带的TestBed、ComponentFixture这些工具,不需要引入selenium——那是e2e测试用的。如果发现有类似import { ... } from 'selenium-webdriver'的语句,直接删掉就行。配置Webpack,忽略Node.js模块
如果是用自定义Webpack配置打包测试代码,在你的webpack配置文件(比如webpack.test.config.js)里添加node选项,告诉Webpack不要处理fs模块:module.exports = { // 其他已有配置... node: { fs: 'empty' } };这个设置会让Webpack遇到
require('fs')时,用一个空对象替代,避免在浏览器里触发不存在的API调用。Angular CLI项目的配置方式
如果你用Angular CLI管理项目,需要先创建上面提到的webpack.test.config.js,然后修改angular.json里的测试配置,指定使用这个自定义Webpack文件:"test": { "builder": "@angular-devkit/build-angular:karma", "options": { "webpackConfig": "./webpack.test.config.js", // 其他原有选项... } }检查Karma配置
打开karma.conf.js,看看有没有在files或者preprocessors里不小心引入了selenium-webdriver相关的文件,确保只打包你的测试代码和Angular依赖,不要包含Node.js端的模块。
按照上面的步骤排查,基本就能解决这个报错了。
内容的提问来源于stack exchange,提问作者Philip Puthenvila

