我正在尝试使用jasmine / karma为角度服务编写单元测试。我有一个类似的服务测试,工作得很好。但是这个有一些额外的依赖,是在一个不同的模块,只是没有找到注入服务。
服务看起来像这样。 bService
位于同一模块中,但commonFactory
和commonService
位于另一个模块中,例如commonModule
。
(function () {
'use strict';
angular
.module('myService')
.service('aService', aService);
aService.$inject = [
'commonFactory',
'commonService'
'bService'
];
function aService (
commonFactory,
commonService,
bService
) {
};
return {
codeIWantToTest: CodeIWantToTest;
}
function CodeIWantToTest () {
console.log('surprise!');
}
})();
我的茉莉花测试看起来像:
describe('myService.aService', function () {
'use strict';
var aService;
// I tried adding beforeEach(module('commonModule')); too, but that didn't do anything
beforeEach(module('myService'));
beforeEach(function() {
inject(function(_aService_) {
console.log('getting aService');
aService = _aService_;
});
});
it('tests my service is defined', function() {
expect(myService).toBeDefined();
});
});
此测试失败。 myService
未定义,并且注入函数中的console.log
不会触发。我的karma.conf.js
基本上按照它们注入服务的顺序列出依赖项,然后添加服务然后添加测试。
什么会导致注入不能获取服务?我错过了什么?我提到我对commonService
进行了类似的测试,它运行得很好。所以我很困惑。
答案 0 :(得分:2)
我团队的另一个开发人员找到了解决方案,我想将其作为未来人们的答案发布。我感觉这是一个依赖性问题,而且确实如此。当我们正确加载所有JS内容时,组件使用的模板正在加载另一个js依赖项。所以为了解决这个问题,我们有两个不同的解决方案:
在组件测试文件的顶部,我们可以添加:
beforeEach(function () {
module(function ($provide) {
$provide.constant('myMissingDependency', {
// do things to load the dependency here
});
});
});
在我们的案例中,它是一个翻译库
另一个解决方案是将“shim”文件添加到单元测试目录中,并在测试之前使用karma.config.js加载它。看起来像是:
(function() {
angular
.module('MyService')
.constant('myMissingDependency', Object.freeze({
// things to load the dependency
}));
})();
我无法切换到Chrome,因为我们正在使用Docker而无法让测试在本地运行以运行Chrome。因此,我需要添加第二组眼睛。