使用业力测试 Angular,文件排序
Testing Angular with karma, file ordering
我已经为我的 karma 文件加载顺序苦苦挣扎了一段时间,这是我的 karma.config.js:
的文件配置
files: [
'bower/angular/angular.js',
'node_modules/angular-mocks/angular-mocks.js',
'src/**/*.module.js',
'src/**/*.js',
'tests/**/*.js'
],
我真正要测试的 2 个文件是 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 依赖模块(angular-模拟)
- 我的模块
- 我的控制器、工厂、指令等...
- 我的测试文件
然而,当 运行 这样做时,我收到以下错误:Error: [ng:areq] Argument 'mainCtrl' is not a function, got undefined
这可能发生在我想在我的测试文件中实例化我的控制器的那一刻。
奇怪的是,当我将控制器名称更改为按字母顺序排列在 main.module.js
之后的名称时,例如更改为 xxx.controller.js
时一切正常。根据业力文档:
Multiple files matching a single pattern are sorted alphabetically.
这让我相信我的控制器和模块都与模式匹配 src/**/*.js
。然而,文档还指出:
Each file is included exactly once. If multiple patterns match the same file, it's included as if it only matched the first pattern.
所以这根本不应该发生,我的模块匹配两种模式,但由于模块模式列在控制器模式上方,它应该匹配较早声明的模式,因此在控制器之前加载。
当我检查网络选项卡时,我很困惑地发现加载顺序实际上很好(如在模块 > 控制器 > 测试中)并且与我将文件名更改为后面的内容时完全相同模块。
I 运行 karma 从我的项目的根目录使用以下命令:karma start karma.config.js
我的karma版本是0.13.0
就像@hansmaad 所说的那样,我最终找到了从我的控制器模式中排除模块的 glob 模式,因此将 src/**/*.js
更改为 'src/**/!(*.module)*.js'
对我有用。认为早期的解决方案也应该根据业力的文档工作。也许这是 karma 0.13.0 中的错误?
试试这个方法。
files: [
'bower/angular/angular.js',
'node_modules/angular-mocks/angular-mocks.js',
'src/**/*.js',
'tests/**/*.js'
],
我刚刚发布了 v0.13.1
修复程序应该可以解决这个问题,请告诉我它是否适合你。
我已经为我的 karma 文件加载顺序苦苦挣扎了一段时间,这是我的 karma.config.js:
的文件配置files: [
'bower/angular/angular.js',
'node_modules/angular-mocks/angular-mocks.js',
'src/**/*.module.js',
'src/**/*.js',
'tests/**/*.js'
],
我真正要测试的 2 个文件是 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 依赖模块(angular-模拟)
- 我的模块
- 我的控制器、工厂、指令等...
- 我的测试文件
然而,当 运行 这样做时,我收到以下错误:Error: [ng:areq] Argument 'mainCtrl' is not a function, got undefined
这可能发生在我想在我的测试文件中实例化我的控制器的那一刻。
奇怪的是,当我将控制器名称更改为按字母顺序排列在 main.module.js
之后的名称时,例如更改为 xxx.controller.js
时一切正常。根据业力文档:
Multiple files matching a single pattern are sorted alphabetically.
这让我相信我的控制器和模块都与模式匹配 src/**/*.js
。然而,文档还指出:
Each file is included exactly once. If multiple patterns match the same file, it's included as if it only matched the first pattern.
所以这根本不应该发生,我的模块匹配两种模式,但由于模块模式列在控制器模式上方,它应该匹配较早声明的模式,因此在控制器之前加载。
当我检查网络选项卡时,我很困惑地发现加载顺序实际上很好(如在模块 > 控制器 > 测试中)并且与我将文件名更改为后面的内容时完全相同模块。
I 运行 karma 从我的项目的根目录使用以下命令:karma start karma.config.js
我的karma版本是0.13.0
就像@hansmaad 所说的那样,我最终找到了从我的控制器模式中排除模块的 glob 模式,因此将 src/**/*.js
更改为 'src/**/!(*.module)*.js'
对我有用。认为早期的解决方案也应该根据业力的文档工作。也许这是 karma 0.13.0 中的错误?
试试这个方法。
files: [
'bower/angular/angular.js',
'node_modules/angular-mocks/angular-mocks.js',
'src/**/*.js',
'tests/**/*.js'
],
我刚刚发布了 v0.13.1
修复程序应该可以解决这个问题,请告诉我它是否适合你。