【问题标题】:Gulp + karma + jasmine + angular + singleRun:true = angular fails to injectGulp + karma + jasmine + angular + singleRun:true = angular 注入失败
【发布时间】:2016-01-18 17:02:22
【问题描述】:

我在通过 Karma 和 Gulp 运行 Jasmine 测试时遇到问题,我正在使用

通过 gulp 任务运行测试
return new karma.Server({
    configFile: __dirname + '\\karma.conf.js',
    singleRun: true
}, done).start();

我的角度依赖注入失败,我得到一个标准的角度unknown provider myProvider 错误。当我将singleRun 属性更改为false 时,大多数单元测试都通过了(尽管有一组仍然失败)。

测试已经(并且仍然)在 Chutzpah 中运行良好。

我已经尝试将我的测试减少到准系统:

var myProvider;
beforeEach(module('MyModule'));

beforeEach(inject(function (_my_) {
    myProvider = _my_;
}));

it("exists", function () {
    expect(myProvider).not.toBeUndefined();
});

它仍然失败并出现unknown provider myProvider 错误。同样,如果我将singleRun 设置为false,它们运行良好。我试过运行 PhantomJS 和 Chrome,它们都表现出完全相同的行为。

我正在使用 Angular 1.4.7,我在 package.json 中的依赖项看起来像

  "dependencies": {
    "gulp": "^3.9.0",
    "gulp-chug": "^0.4.2",
    "gulp-install": "^0.6.0",
    "gulp-util": "^3.0.7",
    "phantomjs": "^1.9.19",
    "jasmine-core": "^2.4.1",
    "karma": "^0.13.19",
    "karma-jasmine": "^0.3.6",
    "karma-phantomjs-launcher": "^0.2.3",
    "karma-spec-reporter": "^0.0.23",
    "karma-chrome-launcher": "^0.2.2"
  }

karma.conf.js:

module.exports = function (config) {
    config.set({
        frameworks: ["jasmine"],
        reporters: ["spec"],
        browsers: ["PhantomJS"],
        files: [
            "./path/to/jquery/jquery-1.11.0.min.js",

            "./path/to/angular/angular.js",
            "./path/to/angular/angular-route.js",
            "./path/to/angular/angular-mocks.js",

            // I'm using this path order (app -> modules -> all) 
            // due to recommendations found on SO
            "./path/to/application/app.js",
            "./path/to/application/**/*Module.js",
            "./path/to/application/**/*.js",

            // For now, I'm just running the one test to simplify debugging
            "./path/to/tests/myTest.Test.js"
        ]
    });
};

有什么想法吗?

【问题讨论】:

    标签: javascript angularjs gulp karma-runner karma-jasmine


    【解决方案1】:

    事实证明,我们的自定义 Angular 提供程序具有内部依赖项,由于某种原因无法使用 singleRun: true 解决。

    我在 karma.conf 中专门设置了这些文件的加载顺序,以便以“正确”顺序加载依赖项,现在我得到与使用 singleRun:false 运行时相同的结果(与 @987654323 相同的几个测试@ 仍然失败,但那是另一回事了)。

    这与 Chutzpah 一起工作的原因是那些引用(在每个单独的测试文件中列出)的顺序正确。

    【讨论】:

      【解决方案2】:

      你的 Karma conf 看起来太简单了。您需要在 karma conf 中定义预处理器。您需要预加载 Angular Javascript 文件。您还应该预加载 HTML 文件。如果测试 HTTP,您可能也想预加载角度模拟。这应该给你一个先机。有任何具体问题请提出。

      'use strict';
      
      module.exports = function (config) {
        config.set({
          basePath: './',
          browsers: ['PhantomJS'],
          frameworks: ['jasmine'],
          reporters: ['mocha', 'coverage'],
          singleRun: true,
          preprocessors: {
            'src/**/!(*spec)*.js': ['coverage'],
            'dest/**/*.html': ['ng-html2js']
          },
          ngHtml2JsPreprocessor: {
            stripPrefix: 'dest/',
            moduleName: 'ngHtmlFiles'
          },
          coverageReporter: {
            type: 'html',
            dir: 'coverage'
          },
          files: [
            'dest/vendor.min.js',
            'bower_components/angular-mocks/angular-mocks.js',
            'src/**/*.js',
            'dest/**/*.html'
          ]
        });
      };
      

      【讨论】:

      • 我还没有发布我的 karma.conf,不过它看起来很像您发布的那个。就像我说的,只要 singleRun 属性不正确,一切都会加载和工作,包括角度。为什么要加载 HTML 文件?我根本看不出我的观点与我的测试和逻辑有什么关系?如果这就是您所指的,我目前没有任何指令测试。不过,我明天可以发布我的 karma.conf,我只是认为它不相关。
      • 如果测试 HTTP,您希望加载 HTML 文件,因为您对测试中的 HTTP 请求有预期,如果您不预加载 HTML,您也必须预期所有 HTML 文件 HTTP 请求,这并不是您真正想要的进行测试 - 你使用 $httpBackend 测试 HTTP - 这是它变得相关的时候
      • 好的,我没有真正看到该实用程序,但我们没有这样做。我正在使用 httpbackend,但要模拟 AJAX 服务请求。在这些情况下,我会在测试中手动模拟和解决这些问题。我们根本不对任何 HTML 文件进行任何实际请求。在任何情况下,它们都不会解析为 HTML 文件。稍后我会发布一个示例 karma.conf。
      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 2015-02-10
      相关资源
      最近更新 更多