单元测试角度服务,beforeEach注入不执行

时间:2017-01-27 14:54:30

标签: angularjs unit-testing jasmine karma-runner

我正在尝试使用jasmine / karma为角度服务编写单元测试。我有一个类似的服务测试,工作得很好。但是这个有一些额外的依赖,是在一个不同的模块,只是没有找到注入服务。

服务看起来像这样。 bService位于同一模块中,但commonFactorycommonService位于另一个模块中,例如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进行了类似的测试,它运行得很好。所以我很困惑。

1 个答案:

答案 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。因此,我需要添加第二组眼睛。