Angular 1.6,$ compileProvider和测试

时间:2017-01-20 16:31:00

标签: javascript angularjs testing jasmine karma-runner

我有一个使用Angular 1.5 的项目构建, 1.6 更新Angular团队决定默认情况下禁用预分配控制器绑定,如果你想启用它们然后你需要做:$compileProvider.preAssignBindingsEnabled(true);

这对应用程序本身来说不是什么大问题,我需要做的就是添加一个使用$compileProvider的配置语句

.config(function($compileProvider){ 
  $compileProvider.preAssignBindingsEnabled(true);
})

但是在测试方面,我遇到了麻烦。我有很多模块,其中没有一个使用config

我有测试可以拉入我所有的模块并运行这样的东西:

beforeEach(function () {
    module('myModule');
    inject(function ($injector) {
        $rootScope = $injector.get('$rootScope');
        $compile = $injector.get('$compile');
    });
    // do stuff, run tests
});

这些测试现在都失败了。对此的简单修复是为所有模块添加一个配置,并在所有这些模块上运行compileProvider或执行以下操作:

// myModule1.spec.js
beforeEach(function () {
    module('myModule', function ($compileProvider) {
        $compileProvider.preAssignBindingsEnabled(true);
    });
    ...
});

// myModule2.spec.js
beforeEach(function () {
    module('myModule2', function ($compileProvider) {
        $compileProvider.preAssignBindingsEnabled(true);
    });
    ...
});

// myModule3.spec.js
beforeEach(function () {
    module('myModule3', function ($compileProvider) {
        $compileProvider.preAssignBindingsEnabled(true);
    });
    ...
});

但问题是我有不到一百个组件,并希望在全球范围内将其设置在一个地方。

我怎么能这样做?有可能吗?

2 个答案:

答案 0 :(得分:1)

我想出了如何为我的整个应用配置一次此设置。

在karma.conf.js中,在包含angular-mocks.js之后,包含另一个配置ngMock模块的文件:

(function() {
    'use strict';

    angular.module('ngMock').config(function($compileProvider) {
        $compileProvider.preAssignBindingsEnabled(true);
    });
})();

这修复了我的所有测试。

答案 1 :(得分:0)

beforeEach(module(function ($compileProvider) {
  $compileProvider.preAssignBindingsEnabled(true);
}));
...
beforeEach(module('app'));

angular.module('test.compile', []).config(function ($compileProvider) {
  $compileProvider.preAssignBindingsEnabled(true);
})
...
beforeEach(module('test.compile'));
...
beforeEach(module('app'));

每个规范可能有多个beforeEach(module(...))块。由于以这种方式加载的模块是堆叠的,因此具有$compileProvider配置的模块属于顶级describe块。