Karma-Coverage 报告显示代码被覆盖(显然没有被覆盖)
Karma-Coverage Report Shows Code As Covered (which is obviously not covered)
我试图生成一个 HTML 覆盖率报告,但它不包含我期望的输出。也许我在这里错了,但它应该只显示从规范文件调用的那些行和方法,对吧?
不知为何没有。
更新:
我创建了一个存储库来提供一个工作示例,概述了问题:
https://github.com/gearsdigital/stunning-octo-train
这是我的(测试)项目设置。如果需要,我可以将它推送到 GitHub 存储库,因为我不知道如何将 JSFiddle 设置为 运行 此代码。
TL;DR
有一个生成 HTML 覆盖率报告的过程。此报告显示已涵盖的代码,但显然未涵盖,因为没有可用的测试。
karma.conf.js:
var webpack = require('webpack');
var path = require('path');
// Reference webpack.config.js, don't repeat it!
var webpackConfig = require('./webpack.config.js');
// The entry point from the referenced Webpack configuration has to be
// removed or tests will fail in weird and inscrutable ways.
// Easy enough, just define an empty entry object (null won't work).
webpackConfig.entry = {};
webpackConfig.module = {
preLoaders: [
{
test: /\.js$/,
// files within these directories should be excluded
// for babel processing
exclude: /(node_modules)/,
loaders: ['babel?cacheDirectory']
},
{
test: /\.js$/,
include: /(src\/js)/,
exclude: /(vendor)/,
loaders: ['isparta']
}
]
};
/**
* Karma configuration
* @param config
*/
module.exports = function (config) {
config.set({
browsers: ['PhantomJS'],
coverageReporter: {
dir: 'test-results',
reporters: [
{type: 'text-summary'},
{type: 'html', subdir: 'coverage'}
]
},
files: [
'webpack.test.config.js'
],
frameworks: [
'jasmine'
],
preprocessors: {
'webpack.test.config.js': ['webpack']
},
reporters: ['spec', 'coverage'],
webpack: webpackConfig
});
};
webpack.config.js:
var webpack = require('webpack');
var path = require('path');
module.exports = {
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery"
})
]
};
webpack.test.config.js:
// make sure the file name regexp matches your test files.
var testsContext = require.context('./tests', true, /\.spec\.js$/);
testsContext.keys().forEach(testsContext);
// make sure the file name regexp matches your test files.
var srcContext = require.context('./src/js', true, /\.js$/);
srcContext.keys().forEach(srcContext);
bootstrap.js:
import {Calculator} from './modules/Calculator';
let c = new Calculator();
c.add(1,2); // 3
Calculator.js:
export class Calculator {
add(op1, op2) {
return op1 + op2;
}
sub(op1, op2) {
if (typeof op1 !== 'number') {
return false;
}
return op1 - op2;
}
mul(op1, op2) {
return op1 * op2;
}
div(op1, op2) {
return op1 / op2;
}
}
bootstrap.spec.js:
import {Calculator} from '../src/js/modules/Calculator';
describe('Calculator', function () {
it('should return 10', function () {
expect(true).toBe(false);
});
});
生成的报告:
我预计 add()
会被发现,因为它不会在任何测试中调用,而是在 bootstrap.js
中调用。
项目结构:
好吧,我不熟悉 Webpack 或 Babel,但我强烈怀疑由于您将所有文件都包含在 Karma 配置中,所以无论测试中有什么代码都会执行。我已经检查了你的 GitHub 的例子(顺便说一句,做这个的荣誉,它更容易调试),如果我注释掉 cart.js
的第 3 行和第 4 行,覆盖率报告不会将 utilities.js
显示为 'ran'.
长话短说:显然,未封装到函数中的代码通过将文件包含在 Karma 中来获得 运行。另外,当根本没有测试时(比如字面上的 0 it
),不要相信 Karma,在这种特定情况下它是不可靠的。
src/js/bootstrap.js
已加载;这意味着这些行得到执行。
import {Calculator} from './modules/Calculator';
let c = new Calculator();
c.add(1,2); // 3
我猜这个块是罪魁祸首:
{
test: /\.js$/,
include: /(src\/js)/,
exclude: /(vendor)/,
loaders: ['isparta']
}
我的代码不应该只在测试期间运行吗?
简短的回答是否定的。
当您导入模块时,任何不在闭包/函数/方法内的内容都可能被覆盖。
// this will get coverage; because it is top-level code outside a function block
var dummy = null;
export class Calculator {
add(op1, op2) {
// this will get coverage only if you call explicitly the function.
return op1 + op2;
}
}
// this will get coverage.
var c = new Calculator();
// and now, Calculator.add will get coverage.
c.add(1,2); // 3
我试图生成一个 HTML 覆盖率报告,但它不包含我期望的输出。也许我在这里错了,但它应该只显示从规范文件调用的那些行和方法,对吧?
不知为何没有。
更新:
我创建了一个存储库来提供一个工作示例,概述了问题:
https://github.com/gearsdigital/stunning-octo-train
这是我的(测试)项目设置。如果需要,我可以将它推送到 GitHub 存储库,因为我不知道如何将 JSFiddle 设置为 运行 此代码。
TL;DR
有一个生成 HTML 覆盖率报告的过程。此报告显示已涵盖的代码,但显然未涵盖,因为没有可用的测试。
karma.conf.js:
var webpack = require('webpack');
var path = require('path');
// Reference webpack.config.js, don't repeat it!
var webpackConfig = require('./webpack.config.js');
// The entry point from the referenced Webpack configuration has to be
// removed or tests will fail in weird and inscrutable ways.
// Easy enough, just define an empty entry object (null won't work).
webpackConfig.entry = {};
webpackConfig.module = {
preLoaders: [
{
test: /\.js$/,
// files within these directories should be excluded
// for babel processing
exclude: /(node_modules)/,
loaders: ['babel?cacheDirectory']
},
{
test: /\.js$/,
include: /(src\/js)/,
exclude: /(vendor)/,
loaders: ['isparta']
}
]
};
/**
* Karma configuration
* @param config
*/
module.exports = function (config) {
config.set({
browsers: ['PhantomJS'],
coverageReporter: {
dir: 'test-results',
reporters: [
{type: 'text-summary'},
{type: 'html', subdir: 'coverage'}
]
},
files: [
'webpack.test.config.js'
],
frameworks: [
'jasmine'
],
preprocessors: {
'webpack.test.config.js': ['webpack']
},
reporters: ['spec', 'coverage'],
webpack: webpackConfig
});
};
webpack.config.js:
var webpack = require('webpack');
var path = require('path');
module.exports = {
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery"
})
]
};
webpack.test.config.js:
// make sure the file name regexp matches your test files.
var testsContext = require.context('./tests', true, /\.spec\.js$/);
testsContext.keys().forEach(testsContext);
// make sure the file name regexp matches your test files.
var srcContext = require.context('./src/js', true, /\.js$/);
srcContext.keys().forEach(srcContext);
bootstrap.js:
import {Calculator} from './modules/Calculator';
let c = new Calculator();
c.add(1,2); // 3
Calculator.js:
export class Calculator {
add(op1, op2) {
return op1 + op2;
}
sub(op1, op2) {
if (typeof op1 !== 'number') {
return false;
}
return op1 - op2;
}
mul(op1, op2) {
return op1 * op2;
}
div(op1, op2) {
return op1 / op2;
}
}
bootstrap.spec.js:
import {Calculator} from '../src/js/modules/Calculator';
describe('Calculator', function () {
it('should return 10', function () {
expect(true).toBe(false);
});
});
生成的报告:
我预计 add()
会被发现,因为它不会在任何测试中调用,而是在 bootstrap.js
中调用。
项目结构:
好吧,我不熟悉 Webpack 或 Babel,但我强烈怀疑由于您将所有文件都包含在 Karma 配置中,所以无论测试中有什么代码都会执行。我已经检查了你的 GitHub 的例子(顺便说一句,做这个的荣誉,它更容易调试),如果我注释掉 cart.js
的第 3 行和第 4 行,覆盖率报告不会将 utilities.js
显示为 'ran'.
长话短说:显然,未封装到函数中的代码通过将文件包含在 Karma 中来获得 运行。另外,当根本没有测试时(比如字面上的 0 it
),不要相信 Karma,在这种特定情况下它是不可靠的。
src/js/bootstrap.js
已加载;这意味着这些行得到执行。
import {Calculator} from './modules/Calculator';
let c = new Calculator();
c.add(1,2); // 3
我猜这个块是罪魁祸首:
{
test: /\.js$/,
include: /(src\/js)/,
exclude: /(vendor)/,
loaders: ['isparta']
}
我的代码不应该只在测试期间运行吗?
简短的回答是否定的。
当您导入模块时,任何不在闭包/函数/方法内的内容都可能被覆盖。
// this will get coverage; because it is top-level code outside a function block
var dummy = null;
export class Calculator {
add(op1, op2) {
// this will get coverage only if you call explicitly the function.
return op1 + op2;
}
}
// this will get coverage.
var c = new Calculator();
// and now, Calculator.add will get coverage.
c.add(1,2); // 3