karma.conf.js 文件自动排序?

karma.conf.js automatic file ordering?

我有一个按功能排序的大型 angularjs 项目。我想设置单元测试,但在获取 karma.conf.js 文件排序设置时遇到问题。

我尝试指定一个简单的 glob 模式,如 **/*.js,但由于 运行 时它们包含在 Karma 中的顺序,我的许多模块未能加载。据我了解,它是按字母顺序排列的,第一个匹配项。

我可以通过执行以下操作手动确定顺序来解决此问题:

// list of files / patterns to load in the browser
files: [
  // External scripts
  'bower_components/angular/angular.js',
  'bower_components/angular-mocks/angular-mocks.js',
  'bower_components/angular-cookies/angular-cookies.js',
  'bower_components/angular-resource/angular-resource.js',
  'bower_components/angular-route/angular-route.js',

  // NOTE: ORDER IS IMPORTANT
  // Modules: load module first, then all controllers, services, etc
  'scripts/module1/module1.js',
  'scripts/module1/**/*.js',
  'scripts/module2/module2.js',
  'scripts/module2/**/*.js',

  // Load overall app module last
  'scripts/app.js',

  // Load mocks and tests
  'test/mock/**/*.js',
  'test/spec/**/*.js'
],

随着新模块的添加,随着时间的推移维护起来似乎会很麻烦。有没有办法自动解决排序问题?

注意:我想的一个可能的解决方案是将所有文件连接在一起,但我用谷歌搜索看是否其他人正在这样做,但没有找到示例。

我使用 browserify,我没有遇到任何问题,这是我的配置:

module.exports = function(config) {
  config.set({

    basePath: '',
    frameworks: ['browserify', 'jasmine'],
    files: [
      'bower_components/angular/angular.js',
      'bower_components/angular-mocks/angular-mocks.js',
      'dev/**/*Spec.js'
    ],
    exclude: [
    ],
    browserify: {
      watch: false,
      debug: true
    },
    preprocessors: {
      'dev/**/*Spec.js': ['browserify']
    },
    reporters: ['progress'],
    port: ****,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: false,
    browsers: ['Chrome'],
    singleRun: true
  });
};

我想您可能会在这里研究不同的解决方案,具体取决于您希望如何管理您的项目。

解决方案 n.1

使用AMD/RequireJS:不要一次加载所有模块,而是在需要时才加载它们。 有时它可能无法满足您的需求,使项目变得过于复杂,因此请看下面。

注意:恕我直言,这是最优雅的解决方案和业力does support requireJS

解决方案 n.2

创建一个命名空间,您可以在其中附加所有内容并在 DOM 准备就绪时启动它们(通常很快,但这实际上取决于您加载了多少脚本)

// module A
// Something like this should be fine
(function(){
  window.MyNamespace = window.MyNamespace || {};
  // append things to the namespace...
})();

// module B
(function(){
  window.MyNamespace = window.MyNamespace || {};
  // append things to the namespace...
})();

// This is very rough but it should give the idea
window.ondomready = MyNamespace.start;

注意:虽然这可能有效,但您必须 fiddle 对您的项目进行一些调整以相应地更改结构。

除非你真的讨厌 requireJS 和所有模块的东西,否则我会选择上面的那个。

解决方案 n.3

以编程方式订购您的 Karma 文件:我写过它 in this answer here

注意:这是选项中较难维护的一个。

如果这样

  // Modules: load module first, then all controllers, services, etc
  'scripts/module1/module1.js',
  'scripts/module1/**/*.js',
  'scripts/module2/module2.js',
  'scripts/module2/**/*.js',

可以改为在模块声明文件上强制使用相同的文件命名约定,即这个

  // Modules: load module first, then all controllers, services, etc
  'scripts/module1/moduleDeclaration.js',
  'scripts/module1/**/*.js',
  'scripts/module2/moduleDeclaration.js',
  'scripts/module2/**/*.js',

那么你可以这样做

  // Modules: load module first, then all controllers, services, etc
  'scripts/**/moduleDeclaration.js',
  'scripts/**/*.js',

我做了类似的事情,尽管我确实打破了 moduleDeclaration 和 "the rest of it" 之间的接口和类型。