Angular module not available in Karma Jasmine test run

angularjs, jasmine, javascript, karma-runner

Solution

The module(s) needs to be loaded in your karma files before the rest of the application.

This is because "Calling angular.module without the array of dependencies when the module has not yet been defined causes this error to be thrown" docs.angularjs.org. Therefore, you must explicitly load the files before the rest of your application.

In your Karma.config javascript files:

    'app/bower_components/jquery/jquery.js',
    'app/bower_components/angular/angular.js',
    'app/bower_components/angular-mocks/angular-mocks.js',
    'app/bower_components/angular-cookies/angular-cookies.js',
    'app/bower_components/angular-resource/angular-resource.js',
    'app/bower_components/angular-route/angular-route.js',
    'app/bower_components/angular-sanitize/angular-sanitize.js',
    'app/bower_components/angular-scenario/angular-scenario.js',

    'app/scripts/app.js',        // Load your module before the rest of your app.

    'app/scripts/controllers/*.js',
    'app/scripts/directives/*.js',
    'app/scripts/services/*.js',
    'lib/routes.js',           
    'test/karma/unit/**/test.spec.js' 

Problem

I'm using angular full stack for development, my karma.conf.js file is ``` files: [ 'app/bower_components/jquery/jquery.js', 'app/bower_components/angular/angular.js', 'app/bower_components/angular-mocks/angular-mocks.js', 'app/bower_components/angular-cookies/angular-cookies.js', 'app/bower_components/angular-resource/angular-resource.js', 'app/bower_components/angular-route/angular-route.js', 'app/bower_components/angular-sanitize/angular-sanitize.js', 'app/bower_components/angular-scenario/angular-scenario.js', 'app/scripts/controllers/*.js', 'app/scripts/directives/*.js', 'app/scripts/services/*.js', 'app/scripts/app.js', 'lib/routes.js', 'test/karma/unit/**/test.spec.js' ], ``` Test Spec: ``` 'use strict'; (function() { describe('App', function() { describe('TestController', function() { beforeEach(function() { this.addMatchers({ toEqualData: function(expected) { return angular.equals(this.actual, expected); } }); }); // Load the controllers module beforeEach(module('ratefastApp')); // Initialize the controller and a mock scope var TestController, mockUserResource, scope, $httpBackend, $routeParams, $location; // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_). // This allows us to inject a service but then attach it to a variable // with the same name as the service. beforeEach( inject(function($controller, $rootScope, _$location_, _$routeParams_, _$httpBackend_) { scope = $rootScope.$new(); TestController = $controller('TestController', { $scope: scope }); $routeParams = _$routeParams_; $httpBackend = _$httpBackend_; $httpBackend.when('GET', '/api/test/page/:pagenum') .respond([{title: 'test'}]); $location = _$location_; })); }); }); }); ``` On running the above I'm getting `$injector:nomod Module is not available`.

Original source