使用Angular.js + Jasmine运行Istanbul代码覆盖率工具时遇到了一些困难。 我在Coffeescript中编码,但由于Instanbul还不支持它,所以在每次保存时都会将源转换为JS。
基本上,我没有在这里看到测试和测试代码之间的关系,因为没有单元测试的文件仍然可以获得66%的覆盖率,而且......根本没有意义。
正如我在标题中所提到的,我使用Karma作为测试运行器,但命令行产生相同的结果。
示例Angular.js控制器(已编译.coffee):
'use strict';
angular.module('app.controllers').controller('HelpIndexCtrl', [
'$scope', function($scope) {
return $scope.foo = 'bar';
}
]);
和单元测试:
'use strict'
describe "controllers", ->
beforeEach angular.mock.module "app.controllers"
scope = rootScope = {}
describe "HelpIndexCtrl", -> inject ($controller)->
ctrl = $controller 'HelpIndexCtrl', $scope:scope
it 'should have working scope', ->
expect(scope.foo).toBe 'bar'
答案 0 :(得分:3)
这个解决方案在我的案例中完美运行并为多个大中型项目提供动力(我使用的是karma@0.9.4):
事实证明,使用 grunt 转换 .coffee 文件然后传递 .js 文件对我来说更方便到业力覆盖处理器:
module.exports = function (karma) {
karma.set({
basePath: '../',
frameworks: ['jasmine'],
files: [
// -------- START: IMPORTS ----------
"vendor/angular-ui-utils/modules/ie-shiv/ie-shiv.js",
"vendor/jquery/jquery.js",
"vendor/es5-shim/es5-shim.js",
"vendor/lodash/lodash.js",
"vendor/angular/angular.js",
// and so on for the next 80 lines...
// -------- END: IMPORTS ----------
'vendor/angular-mocks/angular-mocks.js',
"vendor/sinonjs/sinon.js",
'vendor/angular-*/angular-*.js',
'public/js/templates.js',
'test/js/**/*.js',
//////////////////
// Custom Mocks //
//////////////////
'test/js-unit/**/*.mock.js',
//////////////////
// CoffeeScript //
//////////////////
'test/js-unit/**/*.spec.js'
],
reporters: ['progress', 'coverage', 'junit'],
plugins: [
'karma-jasmine',
'karma-script-launcher',
'karma-phantomjs-launcher',
'karma-junit-reporter',
'karma-coverage',
'karma-coffee-preprocessor',
'karma-growl-reporter'
],
junitReporter: {
outputFile: 'test-results.xml'
},
// web server port
// CLI --port 3334
port: 3334,
// cli runner port
// CLI --runner-port 9100
runnerPort: 9100,
// enable / disable colors in the output (reporters and logs)
// CLI --colors --no-colors
colors : true,
logLevel : karma.LOG_DISABLE,
autoWatch : true,
loggers : [],
browsers : ['PhantomJS'],
// If browser does not capture in given timeout [ms], kill it
// CLI --capture-timeout 5000
captureTimeout: 5000,
// Auto run tests on start (when browsers are captured) and exit
// CLI --single-run --no-single-run
singleRun: true,
// report which specs are slower than 500ms
// CLI --report-slower-than 500
reportSlowerThan: 500,
coverageReporter : {
type: 'html',
dir: 'test/coverage/'
},
preprocessors: {
'test/js/**/*.js': 'coverage'
}
});
}
coffee:
compile:
files:
'public/js/app.js' : ['app/**/*.coffee']
options:
sourceMap: yes
join: yes
bare: yes
compileForTests:
options:
bare: yes
expand: yes
flatten: no
cwd: 'app/'
src: ['**/*.coffee']
dest: 'test/js/'
ext: '.js'
compileTests:
请注意,随后的业力小版本需要不同的配置设置。此配置不适用于karma@0.9.3。但是,配置结构的差异主要是美学的(例如 config 方法重构为 set 等)。