Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't get my head around "Injector already created, can not register a module!" error

Tags:

angularjs

My application seems to run fine. I started writing test cases and got the dreaded Injector already created, can not register a module! error.

Here's my test code. These are the only lines in the file.

'use strict';

var fac,
    osf,
    obff;

beforeEach(module("myApp"));

beforeEach(inject(function (OrderSashingFactory) {
    fac = OrderSashingFactory;
}));

I really don't know where to go from here - I am going in circles.

EDIT - here's my karma.conf.js file. I have other tests that run fine.

// 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
    });
};
like image 743
Tony Ennis Avatar asked Aug 29 '14 03:08

Tony Ennis


3 Answers

If you are mixing calls to module('someApp') and inject($someDependency) you will get this error.

All your calls to module('someApp') must occur before your calls to inject($someDependency).

like image 178
zayquan Avatar answered Oct 21 '22 08:10

zayquan


You haven't wrapped your test in a describe, it would look something like this:

describe('MyTestName', function () { 
    'use strict';

    var fac,
        osf,
        obff;

    beforeEach(module("myApp"));

    beforeEach(inject(function (OrderSashingFactory) {
        fac = OrderSashingFactory;
    }));
});
like image 44
axelduch Avatar answered Oct 21 '22 09:10

axelduch


To add on top of that answer from @axelduch, i had an issue where another file would not have the describe in, and that's what was causing my Injector already created, can not register a module!

If you run your tests with many files linked like this (this is using requirejs)

define(["require", "exports", "./test1.tests", "./test2.tests"], function (require, exports, Test1, Test2) {
    describe("Test Module", function () {
        Test1.tests();
        Test2.tests();
    });
});

Then ensure EACH tests that are run in this describe here contains their own describe method in them. So for example, the Test1 file would look like this

    function tests() {
        describe("Test directive", function () {
            beforeEach(function () {
            });
            afterEach(function () {
            });
        });
    }

Ensure all your linked tests file within the scope of your test has their own describe method, otherwise you may not know it but it's another test that makes your unit test fail.. and It can take you a long time to realize it.

like image 23
Stacknerd Avatar answered Oct 21 '22 08:10

Stacknerd