Javascript Angular 1.6,$compileProvider和测试

Javascript Angular 1.6,$compileProvider和测试,javascript,angularjs,testing,jasmine,karma-runner,Javascript,Angularjs,Testing,Jasmine,Karma Runner,我有一个Angular1.5的项目构建,Angular团队决定在默认情况下禁用预分配控制器绑定,如果要启用它们,则需要执行以下操作:$compileProvider.preAssignBindingsEnabled(true) 应用程序本身没有太大问题,我只需要添加一个使用$compileProvider .config(function($compileProvider){ $compileProvider.preAssignBindingsEnabled(true); }) 但说到测

我有一个Angular1.5的项目构建,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
});
// 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);
    });
    ...
});
这些测试现在都失败了。解决这个问题的简单方法是向我的所有模块添加配置,并在所有模块上运行compileProvider,或者执行类似操作:

beforeEach(function () {
    module('myModule');
    inject(function ($injector) {
        $rootScope = $injector.get('$rootScope');
        $compile = $injector.get('$compile');
    });
    // do stuff, run tests
});
// 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);
    });
    ...
});
但问题是我有不到100个组件,我想把它放在全球一个地方

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

是的

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


每个规范之前可能有多个
(模块(…)
块。由于以这种方式加载的模块是堆叠的,因此带有
$compileProvider
配置的模块属于顶级
描述
块。

我想出了如何为整个应用程序配置此设置一次的方法

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

(function() {
    'use strict';

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

这修正了我所有的测试。

是的,正如我上面提到的,我必须做这两件事中的一件,但我希望我能在全球某个地方做。这是体面的,虽然。。。创建一个模块并复制粘贴它的声明正如所说的,您只需要在每个顶层
描述
(可能每个文件一次)执行一次。
描述
块的目的之一是在每个
之前为
提供最佳结构。这可能是一个需要从另一端解决的问题。最好有可以单独测试的独立模块。但是,所有在它们之间重用但不会影响可测试性(例如,路由配置会影响)的内容都应该包含在公共模块中。因此,它很可能应该是
angular.module('common',[]).config(function($compileProvider){…})
,所有依赖此
$compile
行为或
common
服务的模块都应该加载它。