2

私は Angular.js アプリを持っており、Browserify でそれを使用して実験しています。アプリは動作しますが、テストも実行したいです。カルマで実行する 2 つのジャスミン テストがあります。私は browserify を使用して、angular.js と angular-mocks.js およびテスト内の他のテスト フィクスチャにアクセスできるようにしています。

バージョンは次のとおりです。

"angular": "^1.4.0",
"angular-mocks": "^1.4.0",
"browserify": "^10.2.3",
"karma": "^0.12.32",
"karma-browserify": "^4.2.1",
"karma-chrome-launcher": "^0.1.12",
"karma-coffee-preprocessor": "^0.2.1",
"karma-jasmine": "^0.3.5",
"karma-phantomjs-launcher": "^0.1.4",

テストを個別に実行すると (karma.conf ファイルのどちらか一方にコメントを付けて)、両方とも問題なく動作します。(ええ!)

しかし、両方を実行すると、このエラーが発生します

    TypeError: Cannot read property '$injector' of null
    at Object.workFn (/tmp/3efdb16f2047e981872d82fd8db9c0a8.browserify:2272:22 <- node_modules/angular-mocks/angular-mocks.js:2271:0)

angular.mocks.js の 2271 行を見ると、

if (currentSpec.$injector) {

したがって、明らかに currentSpec はどういうわけか null になりました。

2 番目のテストで「angular.mock.inject」を呼び出したときに問題を切り分けました。

beforeEach(angular.mock.inject(function (_GridUtilService_) {
  gridUtilService = _GridUtilService_;
}));

これをコメントアウトすると機能しますが、明らかに、gridUtilService でテストを実行することはできません。

karma と browserify を使用して 2 つ (またはそれ以上 :-) の angular-mock jasmine テストを実行する方法を知っている人はいますか?

以下は私のテスト、karma.conf ファイルです。Angular サービスはデプロイ時に機能しますが、この目的のためには、何もしない単純なサービスにすることができます。

カルマ.conf:-

// Karma configuration

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

    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '',

    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['browserify', 'jasmine'],

    // list of files / patterns to load in the browser
    files: [
      'src/main/assets/js/**/*.js',
//      'src/test/**/*.js'
      'src/test/services/SettingUtil*.js',
      'src/test/services/GridUtil*.js'
    ],


    // list of files to exclude
    exclude: [
        'src/main/assets/js/**/app-config.js'
    ],


    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {
      'src/main/assets/js/**/*.js': ['browserify'],
      'src/test/**/*.js': ['browserify']
    },

    browserify: {
        debug: true,
        extensions: ['.js', '.coffee', '.hbs']
    },

    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['progress'],

    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_DEBUG,

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
//    browsers: ['PhantomJS', 'Chrome'],
//    browsers: ['PhantomJS'],
    browsers: ['Chrome'],

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false
  });
};

src/test/services/SettingUtilServiceTest.js:

'use strict';

describe("SettingUtilServiceTest.", function() {
  it("contains spec with an expectation", function() {
    expect(true).toBe(true);
  });

  require('angular');

  require('angular-mocks'); 

  // can't do below see error at https://github.com/xdissent/karma-browserify/issues/10
  //beforeEach(module('dpServices'));

  //so need todo this
  beforeEach(angular.mock.module('dpServices'));

  var fixtures = require('./serviceFixtures.js');

  var sus = fixtures.settingUtilServiceTestFixtures;
  var ts1 = sus.tablesetting1;
  var ts2 = sus.tablesetting2;

  var settingUtilService;

  beforeEach(angular.mock.inject(function (_settingUtilService_) {
      settingUtilService = _settingUtilService_;
    }));

    it('should return an object containing mins and maxs from function minMaxes()', function() {
        expect(ts1).toBeDefined();
        expect(ts2).toBeDefined();
        var minMaxs = settingUtilService.minMaxs(ts1);
        var mins = minMaxs.mins;
        expect(mins).toBeDefined();
        var maxs = minMaxs.maxs;
        expect(maxs).toBeDefined();
    });

});

src/test/services/GridUtilServiceTest.js:

'use strict';

describe("GridUtilServiceTest.", function() {
  it("is a set of tests to test GridUtilService.", function() {
    expect(true).toBe(true);
  });

  require('angular');

  require('angular-mocks');

  // can't do below see error at https://github.com/xdissent/karma-browserify/issues/10
//  beforeEach(module('dpServices'));

  //so need todo this
  beforeEach(angular.mock.module('dpServices'));

  var fixtures = require('./gridFixtures.js');

  var gridFix = fixtures.gridUtilServiceTestFixtures;

  var ts1 = gridFix.tablesetting1;
  var ts2 = gridFix.tablesetting2;
  var ts3 = gridFix.tablesetting3;

  var gridUtilService;

  beforeEach(angular.mock.inject(function (_GridUtilService_) {
    gridUtilService = _GridUtilService_;
  }));

  it('should return an object containing mins and maxs from function minMaxes()', function() {
        expect(ts1).toBeDefined();
        expect(ts2).toBeDefined();
        expect(ts3).toBeDefined();
    });

});

angular セットアップへのアクセスが必要な場合は、それを提供できます (browserify の require() 関数を使用して複数のファイルに分割し、gulp でビルドします... しかし、私が言うように、アプリは正常に実行され、テストは 2 つのテストがある場合にのみ失敗します。問題は、karma-jasmine と angular-mocks、またはcurrentSpec変数の上書きにあると思います。

エラーメッセージなしで角度テストを複数のテストに分割する方法を誰かが知っている場合(モノリシックな角度テストは必要ありません)、すべての助けをいただければ幸いです。ありがとう。

4

1 に答える 1

1

同じ問題がありました。私にとっての問題は、各記述ブロック内にいるのとまったく同じように角度と角度のモックが必要だったためです。2行移動しました

require('angular');
require('angular-mocks');

describe ブロックの上で、それらを 1 回だけ呼び出すようにしました。

于 2016-01-12T07:54:31.577 に答える