【发布时间】:2013-05-11 01:30:36
【问题描述】:
我在使用 Angular.js + Jasmine 运行伊斯坦布尔代码覆盖工具时遇到了一些困难。 我正在使用 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'
【问题讨论】:
-
没有单元测试的文件上 66% 的语句覆盖率来自于 Karma 加载文件时执行的一些语句。控制器声明
angular.module().controller()和'use strict'语句都在加载过程中进行评估。 -
感谢您的评论。我对此很清楚。关键是 - 为什么其余的代码,即。单元测试根本不被评估?我已经用 Karma + Istanbul 进行了单元测试,但结果是一样的。
-
你的 karma 配置文件是什么样的?
-
@NoahFreitas 很抱歉这么晚才回复。它不起作用的原因是单元测试中的错误导致加载 Angular.js 模拟两次并在几个看似随机的情况下禁用注入方法。我还即时将所有 .coffee 文件转换为 js,并在 Karma 中禁用了 coffeescipt 预编译,以确保编译没有问题。我认为这是一件好事,因为您在单元测试和实际代码中使用相同的预编译设置。回到办公室后,我将使用工作 karma.conf.js 发布答案。
-
很抱歉,刚刚发布了一个在我的情况下完美运行的解决方案的答案。尽管有延迟,但希望您会发现它很有用:)
标签: unit-testing angularjs code-coverage jasmine karma-runner