【问题标题】:Testing Angular with karma, file ordering用业力测试 Angular,文件排序
【发布时间】: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
    });
}));

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

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

但是,在运行此程序时,我收到以下错误: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 我做了并且确实有效,但这并不能解决我的问题的核心。当我想测试工厂、指令等时,为每个工厂添加一个模式是很愚蠢的
  • 是的,我知道,但我能想到的唯一解决方案是使用单独的模式加载控制器、工厂、指令。

标签: angularjs karma-runner


【解决方案1】:

我刚刚发布了v0.13.1 的修复程序,应该可以解决这个问题,如果它适合你,请告诉我。

【讨论】:

  • 它现在可以与我原始帖子中的配置一起使用,感谢您这么快解决这个问题:)
  • 这种情况退步了吗?我有一个类似的问题,我排除了一个文件(没有服务/包含/监视),该文件后来被 glob 模式捕获并且确实被提供了。这在 Karma 0.12 的最后一个版本中是可以的
【解决方案2】:

就像@hansmaad 说的那样,我最终找到了 glob 模式以从我的控制器模式中排除模块,因此将 src/**/*.js 更改为 'src/**/!(*.module)*.js' 对我有用。认为早期的解决方案也应该根据业力的文档工作。也许这是 karma 0.13.0 中的一个错误?

【讨论】:

    【解决方案3】:

    试试这个方法。

    files: [
                'bower/angular/angular.js',
                'node_modules/angular-mocks/angular-mocks.js', 
                'src/**/*.js',
                'tests/**/*.js'
            ],
    

    【讨论】:

    • 我之前尝试过,但是由于明显的原因这不起作用:模块和控制器都匹配模式,但是模块之前的任何文件(按字母顺序)将首先加载,这不会使用角度
    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 2014-01-21
    • 2021-05-11
    • 1970-01-01
    • 2019-12-10
    • 2020-11-16
    • 2018-06-07
    • 2019-02-10
    相关资源
    最近更新 更多