【发布时间】:2015-07-16 11:26:54
【问题描述】:
我一直在为我的 karma 文件加载顺序苦苦挣扎,这是我的 karma.config.js 的文件配置:
files: [
'bower/angular/angular.js',
'node_modules/angular-mocks/angular-mocks.js',
'src/**/*.module.js',
'src/**/*.js',
'tests/**/*.js'
],
我真正想要测试的两个文件是src/main/main.module.js 下的模块和src/main/main.controller.js 下的主控制器。
这是我的测试配置(tests/main/main.controller.spec.js 下)
var mockScope,
controller,
backend,
mockInterval,
mockTimeout;
beforeEach(angular.mock.module('main'));
beforeEach(angular.mock.inject(function ($controller, $rootScope, $http, $interval, $timeout) {
mockScope = $rootScope.$new();
mockInterval = $interval;
mockTimeout = $timeout;
controller = $controller('mainCtrl', {
$scope: mockScope,
$http: $http,
$interval: mockInterval,
$timeout: mockTimeout
});
}));
据我所知,这意味着加载顺序如下:
- AngularJS
- AngularJS 依赖模块(角度模拟)
- 我的模块
- 我的控制器、工厂、指令等...
- 我的测试文件
但是,在运行此程序时,我收到以下错误:Error: [ng:areq] Argument 'mainCtrl' is not a function, got undefined,这可能发生在我想在我的测试文件中实例化我的控制器时。
奇怪的是,当我将控制器名称更改为按字母顺序晚于main.module.js 的名称时,例如更改为xxx.controller.js,一切正常。根据业力文档:
匹配单个模式的多个文件按字母顺序排序。
这让我相信我的控制器和模块都与src/**/*.js 模式匹配。但是文档还指出:
每个文件只包含一次。如果多个模式与同一个文件匹配,则将其包含在内,就好像它只匹配第一个模式一样。
所以这甚至不应该发生,我的模块匹配两种模式,但由于模块模式列在控制器模式上方,它应该匹配之前声明的模式,因此在控制器之前加载。
当我检查网络选项卡时,我很困惑地发现加载顺序实际上很好(如在模块 > 控制器 > 测试中),并且与我将文件名更改为模块之后的内容时完全一样。
我使用以下命令从项目的根目录运行 karma:karma start karma.config.js
我的业力版本是 0.13.0
【问题讨论】:
-
您是否尝试从
src/**/*.js中排除模块文件? -
@hansmaad 我刚刚试过这个
'src/**/*.js(!*.module.js)',但是没用,认为这可能不是排除模块的正确方法 -
用你试过的 src/**/*.controller.js 代替 src/**/*.js
-
@MaheshSapkal 我做了并且确实有效,但这并不能解决我的问题的核心。当我想测试工厂、指令等时,为每个工厂添加一个模式是很愚蠢的
-
是的,我知道,但我能想到的唯一解决方案是使用单独的模式加载控制器、工厂、指令。