Не могу опустить голову "Инжектор уже создан, не может зарегистрировать модуль!" ошибка
Мое приложение работает нормально. Я начал писать тестовые примеры и получил опасный Инжектор уже создан, не могу зарегистрировать модуль!.
Вот мой тестовый код. Это единственные строки в файле.
'use strict';
var fac,
osf,
obff;
beforeEach(module("myApp"));
beforeEach(inject(function (OrderSashingFactory) {
fac = OrderSashingFactory;
}));
Я действительно не знаю, куда идти отсюда - я собираюсь в кругах.
EDIT - вот мой файл karma.conf.js
. У меня есть другие тесты, которые работают нормально.
// Karma configuration
// Generated on Mon Aug 25 2014 21:08:59 GMT-0400 (Eastern Daylight Time)
module.exports = function (config) {
config.set({
// base path, that will be used to resolve files and exclude
basePath: '',
// frameworks to use
frameworks: ['mocha', 'chai', 'sinon'],
// list of files / patterns to load in the browser
files: [
'app/bower_components/angular/angular.js',
'app/bower_components/angular-route/angular-route.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/js/*.js',
'app/test/js/*.js',
'app/partials/**/*.html'
],
preprocessors: {
'app/partials/**/*.html' : 'html2js'
},
ngHtml2JsPreprocessor: {
// strip app from the file path
stripPrefix: 'app/'
},
// list of files to exclude
exclude: [
],
// plugins: [
// 'karma-mocha',
// 'karma-chrome-launcher'
// ],
// test results reporter to use
// possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
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_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// Start these browsers, currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera (has to be installed with `npm install karma-opera-launcher`)
// - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`)
// - PhantomJS
// - IE (only Windows; has to be installed with `npm install karma-ie-launcher`)
browsers: ['Chrome'],
// If browser does not capture in given timeout [ms], kill it
captureTimeout: 60000,
// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: false
});
};
Ответы
Ответ 1
Вы не завернули свой тест в describe
, он выглядел бы примерно так:
describe('MyTestName', function () {
'use strict';
var fac,
osf,
obff;
beforeEach(module("myApp"));
beforeEach(inject(function (OrderSashingFactory) {
fac = OrderSashingFactory;
}));
});
Ответ 2
Если вы смешиваете вызовы с module('someApp')
и inject($someDependency)
, вы получите эту ошибку.
Все ваши вызовы module('someApp')
должны появиться перед вашими вызовами на inject($someDependency)
.
Ответ 3
Чтобы добавить поверх этого ответа от @axelduch, у меня была проблема, когда другой файл не содержал бы описания, и что то, что уже создало мой Injector, не может зарегистрировать модуль!
Если вы запускаете свои тесты со многими связанными файлами (это использует requirejs)
define(["require", "exports", "./test1.tests", "./test2.tests"], function (require, exports, Test1, Test2) {
describe("Test Module", function () {
Test1.tests();
Test2.tests();
});
});
Затем убедитесь, что EACH тестов, которые запускаются в этом описании, содержит в них свой собственный метод описания. Так, например, файл Test1 будет выглядеть следующим образом:
function tests() {
describe("Test directive", function () {
beforeEach(function () {
});
afterEach(function () {
});
});
}
Убедитесь, что все ваши файлы связанных тестов в рамках вашего теста имеют свой собственный метод описания, иначе вы можете не знать об этом, но это еще один тест, из-за которого ваш unit test терпит неудачу.. и он может долго вам это нужно.
Ответ 4
Это также означает, что у вас есть что-то вроде следующего:
inject(function ($compile, $rootScope, $document, $timeout) {
// Code processing inject
});
module(function($provide) {
// Provide code
})
Это неправильно, тестовый бегун не позволит вам сделать это в этом порядке, поскольку его уже занятая инъекция и вы прошли фазу для настройки.
Правильный способ:
module(function($provide) {
// Provide code
})
inject(function ($compile, $rootScope, $document, $timeout) {
// Code processing inject
});
убедитесь, что у вас есть это в правильном порядке.