browserify/karma/angular.js TypeError: невозможно прочитать свойство $injector со значением null, когда второй тест использует angular.mock.inject, currentSpec имеет значение null

У меня есть приложение Angular.js, и я экспериментирую с его использованием с 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)

Глядя на строку 2271 angular.mocks.js, он читает

if (currentSpec.$injector) {

Итак, очевидно, что currentSpec каким-то образом стал нулевым.

Я изолировал проблему, когда вызываю «angular.mock.inject» во втором тесте.

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

Если я прокомментирую это, это сработает, но, очевидно, я не смогу запустить тест в моем gridUtilService.

Кто-нибудь знает, как запустить два (или более :-) jasmine-теста angular-mock с кармой и браузером?

ниже мои тесты, файл karma.conf. Службы Angular работают при развертывании, но для этой цели они могут быть просто тупыми службами, которые ничего не делают.

карма.конф:-

// 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... но, как я уже сказал, приложение работает нормально, и тесты терпят неудачу только тогда, когда есть два теста, поэтому Я думаю, что проблема связана с karma-jasmine и angular-mocks или перезаписью переменной currentSpec.

Если кто-нибудь знает, как разделить мои угловые тесты на несколько тестов (мне не нужен монолитный угловой тест) без сообщения об ошибке, вся помощь приветствуется. Благодарю.


person Karl    schedule 14.07.2015    source источник


Ответы (1)


У меня была та же проблема, проблема для меня заключалась в том, что мне требовались угловые и угловые макеты точно так же, как вы были внутри каждого блока описания. Я переместил две строки

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

выше блоков описания и убедился, что вызывал их только один раз.

person Robert Ye    schedule 12.01.2016
comment
спасибо, я попробую и проголосую за вас, если это сработает :-) - person Karl; 12.02.2016