AngularJS + Jasmine unit test Error: [$injector:modulerr] -


i leanring unit testing angular , jasmine. getting following error when running tests:

result message: error: [$injector:modulerr] http://errors.angularjs.org/1.4.9/$injector/modulerr...

unit test

/// <reference path="../scripts/_references.js" /> /// <reference path="jasmine.js" /> /// <reference path="samplecontroller.js" />  describe('controller unit test: ', function () {     var scope, ctrl, $timeout;     var someservicemock;      beforeeach(function () {         module('app');     });      beforeeach(function () {         someservicemock = jasmine.createspyobj('someservice', ['someasynccall']);         inject(function ($rootscope, $controller, $q, _$timeout_) {             scope = $rootscope.$new();             someservicemock.someasynccall.andreturn($q.when('weee'));             $timeout = _$timeout_;             ctrl = $controller('samplecontroller', {                 $scope: scope,                 someservice: someservicemock             });         });     });      it('controller exists', function () {         expect(ctrl).tobedefined();     }); }); 

controller

var app = angular.module('myapp', []); app.controller('samplecontroller', function ($scope, someservice) {      //set properties     $scope.foo = 'foo';     $scope.bar = 'bar';      //add simple function.     $scope.test1 = function () {         $scope.foo = $scope.foo + '!!!';     };      //set $watch.     $scope.$watch('bar', function (v) {         $scope.baz = v + 'baz';     });      //make call injected service.     $scope.test2 = function () {         someservice.someasynccall($scope.foo)           .then(function (data) {               $scope.fizz = data;           });     }; });  app.factory('someservice', function ($timeout, $q) {     return {          // simple method asynchronously.         someasynccall: function (x) {             var deferred = $q.defer();             $timeout(function () {                 deferred.resolve(x + '_async');             }, 100);             return deferred.promise;         }     }; }); 

finally, reference files:

/// <reference path="angular.min.js" /> /// <reference path="angular-mocks.js" /> /// <reference path="angular-animate.min.js" /> /// <reference path="angular-sanitize.min.js" /> /// <reference path="angular-route.min.js" /> /// <reference path="jquery-2.1.1.min.js" /> /// <reference path="jquery.unobtrusive-ajax.js" /> /// <reference path="jquery.unobtrusive-ajax.min.js" /> /// <reference path="jquery.validate.min.js" /> /// <reference path="ui-bootstrap-tpls-0.14.3.min.js" /> /// <reference path="modernizr-2.8.3.js" /> 

when set break point within inject function in test , run debugging mode, nevers goes it.

try modifying test code so, took liberty of modying structure way tests might bit more efficient. smaller controllers / tests not matter more complex functionality ability reset test set makes easier.

the 1st beforeeach inject $injector function can use references. can done in main describe function not change.

the 2nd beforeeach have nested in new describe function. can create batched set of tests each it guaranteed fresh/new controller instance.

if $injector null or undefined means scripts not being loaded or being loaded in wrong order. better troubleshoot need see failing injection because angular not yet aware of it, in case please comment full message/url started @ top of post , can put references in correct order.

controller file

/// <reference path="jquery-2.1.1.min.js" /> /// <reference path="angular.min.js" /> ... rest of code 

unit test file

/// <chutzpah_reference path="angular.min.js"/> /// <chutzpah_reference path="angular-mocks.js"/> // might need additional chutzpah_reference depends on chutzpah configuration found in chutzpah.json /// <reference path="jquery-2.1.1.min.js" /> /// <reference path="angular.min.js" /> /// <reference path="angular-mocks.js" /> /// <reference path="jasmine.js" /> /// <reference path="samplecontroller.js" />  describe('controller unit test: ', function () {     var $rootscope;  //, $timeout;     var someservicemock;      beforeeach(function () {         angular.mock.module("app"); // mock module     });      // setup     beforeeach(inject(function ($injector) {         someservicemock = jasmine.createspyobj('someservice', ['someasynccall']);         someservicemock.someasynccall.andreturn($q.when('weee'));          var $rootscope = $injector.get("$rootscope");         // $timeout = $injector.get("$timeout"); // not used anywhere can see     }));      describe('this executes initial set of tests on controller', () => {         var scope;         var ctrl;         beforeeach(inject(function ($controller) {             scope = $rootscope.$new();             ctrl = $controller('samplecontroller', {                 $scope: scope,                 someservice: someservicemock});         }));          it('controller exists', function () {             expect(scope).tobedefined();             expect(ctrl).tobedefined();         });     }); }); 

edit 1

changed references. added angular mock call.


Comments

Popular posts from this blog

java - pagination of xlsx file to XSSFworkbook using apache POI -

Unlimited choices in BASH case statement -

apache - How do I stop my index.php being run twice for every user -