Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular module not available in Karma Jasmine test run

Tags:

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.

like image 512
sergioramosiker Avatar asked Feb 11 '14 11:02

sergioramosiker


1 Answers

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'  
like image 152
angmerica Avatar answered Sep 20 '22 14:09

angmerica