纽约市运行时覆盖黄瓜
nyc runtime coverage with cucumber
我正在尝试覆盖我用 cucumber/TS 编写的 e2e 测试,但我的测试报告永远无法映射回我的源文件。
该报告只是一个目录列表,单击单个 *.ts 文件会产生一个堆栈跟踪(***
我的 user/repo 名字):
Unable to lookup source: /Users/***/dev/git/***/dist/webpack:/src/gql/index.ts(ENOENT: no such file or directory, open '/Users/***/dev/git/***/dist/webpack:/src/gql/index.ts')
Error: Unable to lookup source: /Users/***/dev/git/***/dist/webpack:/src/gql/index.ts(ENOENT: no such file or directory, open '/Users/***/dev/git/***/dist/webpack:/src/gql/index.ts')
我想做什么:
- 运行 使用 TypeScript sourcemaps 检测的应用程序
- 运行 我针对此应用程序进行的外部测试
- 停止应用程序并为原始 TS 代码生成覆盖率报告
我的设置如下,
- 节点:
v9.4.0
- 网络包:
^4.23.0,
- 打字稿:
~3.1.6
tsconfig:
{
"compilerOptions": {
"rootDir": "./src",
"module": "commonjs",
"target": "es6",
"sourceMap": true,
"outDir": "./dist",
"noEmitOnError": true,
"declaration": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"lib": ["esnext"],
"skipLibCheck": true,
"allowSyntheticDefaultImports": true,
"baseUrl": "src",
"noImplicitAny": true,
"typeRoots": ["./typings", "./node_modules/@types"],
"experimentalDecorators": true
},
"exclude": ["node_modules", "dist"]
}
webpack.config.js:
module.exports = {
entry: ['./src/index.ts'],
target: 'node',
mode: process.env.NODE_ENV === 'dev' ? 'development' : 'production',
externals: [nodeExternals()], // in order to ignore all modules in node_modules folder,
devtool: 'inline-source-map',
module: {
rules: [
{
test: /.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
}
]
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
modules: [path.resolve(__dirname, 'src'), 'node_modules']
},
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js'
}
}
package.json(相关部分):
"scripts": {
"start-coverage": "NODE_ENV=test nyc node --reporter=lcov dist/index.js",
...
},
"nyc": {
"all": true,
"require": "ts-node/register",
"instrument": true,
"report-dir": "./coverage",
"temp-dir": "./temp",
"source-map": true,
"produce-source-map": false
},
问题又出在上面显示的堆栈跟踪无法映射单个文件上。我尝试了多种配置组合,但总是在这里结束。
- 有人知道哪里出了问题吗?
- 我应该为此使用
remap-istanbul
吗?
发现问题。这是 webpack 的一个错误,已在 https://github.com/SitePen/remap-istanbul/issues/68.
中修复
解决方案在webpack中,需要添加选项:
devtoolModuleFilenameTemplate
。输出部分如下所示:
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js',
devtoolModuleFilenameTemplate: '[resource-path]'}
在 webpack.config.js 中只有 devtool: 'source-map'
,就是这样!我们甚至不需要 package.json
中的 nyc
配置,也不需要 tsconfig.json
中的任何修改,除了 sourceMaps:true
.
我正在尝试覆盖我用 cucumber/TS 编写的 e2e 测试,但我的测试报告永远无法映射回我的源文件。
该报告只是一个目录列表,单击单个 *.ts 文件会产生一个堆栈跟踪(***
我的 user/repo 名字):
Unable to lookup source: /Users/***/dev/git/***/dist/webpack:/src/gql/index.ts(ENOENT: no such file or directory, open '/Users/***/dev/git/***/dist/webpack:/src/gql/index.ts')
Error: Unable to lookup source: /Users/***/dev/git/***/dist/webpack:/src/gql/index.ts(ENOENT: no such file or directory, open '/Users/***/dev/git/***/dist/webpack:/src/gql/index.ts')
我想做什么:
- 运行 使用 TypeScript sourcemaps 检测的应用程序
- 运行 我针对此应用程序进行的外部测试
- 停止应用程序并为原始 TS 代码生成覆盖率报告
我的设置如下,
- 节点:
v9.4.0
- 网络包:
^4.23.0,
- 打字稿:
~3.1.6
tsconfig:
{
"compilerOptions": {
"rootDir": "./src",
"module": "commonjs",
"target": "es6",
"sourceMap": true,
"outDir": "./dist",
"noEmitOnError": true,
"declaration": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"lib": ["esnext"],
"skipLibCheck": true,
"allowSyntheticDefaultImports": true,
"baseUrl": "src",
"noImplicitAny": true,
"typeRoots": ["./typings", "./node_modules/@types"],
"experimentalDecorators": true
},
"exclude": ["node_modules", "dist"]
}
webpack.config.js:
module.exports = {
entry: ['./src/index.ts'],
target: 'node',
mode: process.env.NODE_ENV === 'dev' ? 'development' : 'production',
externals: [nodeExternals()], // in order to ignore all modules in node_modules folder,
devtool: 'inline-source-map',
module: {
rules: [
{
test: /.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
}
]
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
modules: [path.resolve(__dirname, 'src'), 'node_modules']
},
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js'
}
}
package.json(相关部分):
"scripts": {
"start-coverage": "NODE_ENV=test nyc node --reporter=lcov dist/index.js",
...
},
"nyc": {
"all": true,
"require": "ts-node/register",
"instrument": true,
"report-dir": "./coverage",
"temp-dir": "./temp",
"source-map": true,
"produce-source-map": false
},
问题又出在上面显示的堆栈跟踪无法映射单个文件上。我尝试了多种配置组合,但总是在这里结束。
- 有人知道哪里出了问题吗?
- 我应该为此使用
remap-istanbul
吗?
发现问题。这是 webpack 的一个错误,已在 https://github.com/SitePen/remap-istanbul/issues/68.
中修复解决方案在webpack中,需要添加选项:
devtoolModuleFilenameTemplate
。输出部分如下所示:
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js',
devtoolModuleFilenameTemplate: '[resource-path]'}
在 webpack.config.js 中只有 devtool: 'source-map'
,就是这样!我们甚至不需要 package.json
中的 nyc
配置,也不需要 tsconfig.json
中的任何修改,除了 sourceMaps:true
.