I am trying to test my AngularJS app with Jasmine via Karma. I get this error (at least, this is the latest of them):
Uncaught TypeError: Cannot read property '$modules' of null
at /Users/benturner/Dropbox/Code/galapagus/app/static/js/angular-mocks.js:1866
From my karma.conf.js:
files: [
'static/js/jquery.min.js',
'static/js/angular.min.js',
'static/js/angular-mocks.js',
'static/js/angular-resource.min.js',
'static/js/angular-scenario.js',
'static/js/angular-loader.min.js',
'static/js/momentous/ctrl_main.js', // contains all my app's code
'test/momentous.js'
],
Here is my test:
(function () {
"use strict";
var controller = null;
var scope = null;
describe("Services", inject(function($rootScope, Moments) {
var mockedFactory, moments, flag, spy;
moments = [{name: 'test'}];
beforeEach(module('momentous', function($provide) {
scope = $rootScope.$new();
$provide.value('$rootScope', scope);
mockedFactory = {
getList: function() {
return moments;
}
};
spy = jasmine.createSpy(mockedFactory.getList);
$provide.value('Moments', mockedFactory);
}));
it('should return moments from the factory service', function() {
runs(function() {
console.log(scope.getList);
flag = false;
setTimeout(function() {
scope.getList();
flag = true;
}, 500);
});
waitsFor(function() {
return flag;
}, "The call is done", 750);
runs(function() {
expect(scope.moments).toEqual([{name: 'test'}]);
expect(spy).toHaveBeenCalled();
});
});
}));
}());
So what I am trying to do is mock my factory service and check that it is returning an array of objects and setting them to a variable in $scope.
There's an async call in there too so I had to use runs() and waitsFor().
I still don't understand how I am injecting my $scope so that I can test against it, and with angular-mocks.js now giving me an error I feel I'm getting further away from solving this, not closer.
I cobbled this together from various docs, guides, and stackoverflow answers. Any guidance? Thanks.
I'm also stuck getting this exact error. My code is similar where I am trying to test a provider so I call module and pass it a function that configures the provider.
SOLVED:
I found the issue is due to calling "inject" to return a delegate to the "describe" method. You can only use inject to return a delegate to "it".
For example:
describe('something', inject(function(something) {})); // will throw the $module is null error
But this will work:
it('something', inject(function(something) {})); // works :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With