伊斯坦布尔代码覆盖摩卡和AngularJS
问题描述:
我有一个非常大的AngularJS应用程序,我使用摩卡和柴(和JSDom)测试浏览器。完美的作品。不过,我现在正在尝试使用伊斯坦布尔添加代码覆盖范围,并且遇到有关Angular错误的问题。伊斯坦布尔代码覆盖摩卡和AngularJS
我的测试命令:mocha src/**/*.spec.js
覆盖命令:istanbul cover _mocha src/**/*.spec.js
,我得到的错误是这样的:
TypeError: Cannot read property '1' of null
at Function.annotate (node_modules/angular/angular.js:3810:24)
at Function.angular.injector.$$annotate (node_modules/angular-mocks/angular-mocks.js:2300:36)
at Object.invoke (node_modules/angular/angular.js:4514:36)
at Context.workFn (node_modules/angular-mocks/angular-mocks.js:2517:20)
Error: Declaration Location
at window.inject.angular.mock.inject (node_modules/angular-mocks/angular-mocks.js:2488:25)
at Suite.describe (src/components/filters/emoticonize.spec.js:9:407)
at Object.<anonymous> (src/components/filters/emoticonize.spec.js:9:183)
at Object.Module._extensions.(anonymous function) [as .js] (node_modules/istanbul/lib/hook.js:107:24)
at require (internal/module.js:20:19)
at Array.forEach (native)
at Object.Module._extensions.(anonymous function) [as .js] (node_modules/istanbul/lib/hook.js:109:37)
at runFn (node_modules/istanbul/lib/command/common/run-with-cover.js:122:16)
at node_modules/istanbul/lib/command/common/run-with-cover.js:251:17
at node_modules/istanbul/lib/util/file-matcher.js:68:16
at node_modules/async/lib/async.js:52:16
at node_modules/async/lib/async.js:361:13
at node_modules/async/lib/async.js:52:16
at done (node_modules/async/lib/async.js:246:17)
at node_modules/async/lib/async.js:44:16
at node_modules/async/lib/async.js:358:17
at FSReqWrap.oncomplete (fs.js:117:15)
这是错误发生:https://github.com/angular/angular.js/blob/v1.4.x/src/auto/injector.js#L101。我已经登录fnText
存在和运行使用伊斯坦布尔测试时,该值是
_emoticonizeFilter_=>{__cov_OCFuCYwLZAl7nm5crSo1eg.s['7']++;emoticonizeFilter=_emoticonizeFilter_;}
我的测试:
require('../../../test-helper');
const expect = require('chai').expect;
describe('filter',() => {
let emoticonizeFilter;
beforeEach(angular.mock.module('components.filters'));
beforeEach(inject((_emoticonizeFilter_) => {
emoticonizeFilter = _emoticonizeFilter_;
}));
describe('emoticonize',() => {
it('should replace a smiley :) with emoji ',() => {
expect(emoticonizeFilter('Hello :)', true)).to.equal('Hello ');
});
it('should not replace smileys when given a falsy parameter',() => {
expect(emoticonizeFilter('Hello :)', false)).to.equal('Hello :)');
});
});
});
所以它打破在beforeEach
,我注入_emoticonizeFilter_
。伊斯坦布尔正在添加Angular不知道如何处理其注释功能的东西。
我该如何解决这个问题?
答
通过从Angular 1.4.x升级到1.5.x来修复。