我正在尝试使用 jasmine/karma 为 Angular 服务编写单元测试。我有一个类似的服务测试,效果很好。但这有一些额外的依赖项,位于不同的模块中,并且只是找不到带有注入(inject)的服务。
该服务看起来像这样。 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!');
}
})();
我的 Jasmine 测试如下:
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
未定义,并且注入(inject)函数中的 console.log
永远不会触发。我的 karma.conf.js 基本上按照注入(inject)服务的顺序列出依赖项,然后添加服务,然后添加测试。
什么会导致注入(inject)无法获取服务?我缺少什么?我提到我对 commonService 有一个类似的测试,它工作得很好。所以我很困惑。
最佳答案
我团队中的另一位开发人员找到了解决方案,我想将其发布为 future 人们的答案。我有一种感觉,这是一个依赖性问题,确实如此。当我们正确加载所有 JS 内容时,组件使用的模板正在加载另一个 js 依赖项。因此,为了解决 jasmine 的问题,我们有两种不同的解决方案:
在组件测试文件的顶部,我们可以添加:
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。因此,我需要为此添加第二双眼睛。
关于angularjs - 单元测试 angular.service ,beforeEach 注入(inject)不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41896782/