angularjs - 单元测试 angular.service ,beforeEach 注入(inject)不执行

标签 angularjs unit-testing jasmine karma-runner

我正在尝试使用 jasmine/karma 为 Angular 服务编写单元测试。我有一个类似的服务测试,效果很好。但这有一些额外的依赖项,位于不同的模块中,并且只是找不到带有注入(inject)的服务。

该服务看起来像这样。 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!');
     }
})();

我的 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/

相关文章:

javascript - 如何使用 Angular 的 $q promise 检索 HTTP 状态代码?

javascript - 如何包装 $http 服务并在 Controller 中使用它获取的数据?

c# - 使用 XUnit 断言异常

javascript - 如何将 jQuery 触发事件传递给函数

javascript - 在 AngularJS 指令中测试 mouseover 和 mouseout 事件

javascript - 如何使用 angularjs 将 JSON 对象中的日期与 "5/17/16"格式的日期进行比较?

javascript - AngularJS 使用 $rootScope 共享工厂,然后丢弃 $rootScope

Django 单元测试;具有多个值的 POST 复选框

unit-testing - TDD 和游戏物理

javascript - Zombie.JS 不执行页面 javascript