Javascript Angular 1.6,$compileProvider和测试
我有一个Angular1.5的项目构建,Angular团队决定在默认情况下禁用预分配控制器绑定,如果要启用它们,则需要执行以下操作: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); }) 但说到测
$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
服务的模块都应该加载它。