使用业力测试 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
    });
}));

据我所知,这意味着加载顺序如下:

  1. AngularJS
  2. AngularJS 依赖模块(angular-模拟)
  3. 我的模块
  4. 我的控制器、工厂、指令等...
  5. 我的测试文件

然而,当 运行 这样做时,我收到以下错误: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 修复程序应该可以解决这个问题,请告诉我它是否适合你。