Reputation: 4685
I am using Jasmine to test an AngularJS factory.
I am having difficulty testing a factory that has a dependency. I have included the code for the factory I am testing and the test code.
The problem is that I am getting errors and the test is failing.
This is the error I am seeing:
Chrome 33.0.1750 (Mac OS X 10.8.5) Testing my Test Service can get an instance of my factory FAILED
Error: [$injector:unpr] http://errors.angularjs.org/1.2.8/$injector/unpr?p0=TestThisServiceProvider%20%3C-%20TestThisService
at Error (native)
at /Users/.../www/lib/angular/angular.min.js:6:449
at /Users/.../www/lib/angular/angular.min.js:32:125
at Object.c [as get] (/Users/.../www/lib/angular/angular.min.js:30:200)
at /Users/.../www/lib/angular/angular.min.js:32:193
at c (/Users/.../www/lib/angular/angular.min.js:30:200)
at Object.d [as invoke] (/Users/.../www/lib/angular/angular.min.js:30:417)
at workFn (/Users/.../www/lib/angular/angular-mocks.min.js:6:20731)
Error: Declaration Location
at window.inject.angular.mock.inject (/Users/.../www/lib/angular/angular-mocks.min.js:6:20394)
at null.<anonymous> (/Users/.../www/tests/myapp/TestServices/controllers.tests.js:54:43)
at /Users/.../www/tests/myapp/TestServices/controllers.tests.js:1:1
Firefox 27.0.0 (Mac OS X 10.8) Lighting Control Service can get an instance of my factory FAILED
Error: [$injector:unpr] http://errors.angularjs.org/1.2.8/$injector/unpr?p0=TestThisServiceProvider%20%3C-%20TestThisService
F/<@/Users/.../www/lib/angular/angular.min.js:6
$b/l.$injector<@/Users/.../www/lib/angular/angular.min.js:32
c@/Users/.../www/lib/angular/angular.min.js:30
$b/p.$injector<@/Users/.../www/lib/angular/angular.min.js:32
c@/Users/.../www/lib/angular/angular.min.js:30
d@/Users/.../www/lib/angular/angular.min.js:30
workFn@/Users/.../www/lib/angular/angular-mocks.min.js:6
angular.mock.inject@/Users/.../www/lib/angular/angular-mocks.min.js:6
@/Users/.../www/tests/myapp/TestServices/controllers.tests.js:54
@/Users/.../www/tests/myapp/TestServices/controllers.tests.js:1
Factory To Test
angular.module('myApp.Module', ["ngResource"])
.factory('TestThisService', function(WebSocketSrvc, $q, $rootScope, $log) {
return {
createData: function(type, msg_object, cb_URI, cbfunction) {
// creates
},
requestData: function(type, cb_URI) {
// requests
},
updateData: function(type, id, msg_object, cb_URI, cbfunction) {
// updates
},
deleteData: function(type, id, cb_URI, cbfunction) {
// deletes
}
}
});
Test Code:
describe("My Service", function() {
// Load your module.
beforeEach(module('myApp.Module','myApp.ModuleTwo'));
// Setup the mock service in an anonymous module.
beforeEach(module(function ($provide) {
$provide.value('WebSocketSrvc', {
variable: 'value',
get: function() {
return 'test';
},
send: function(request, cb_URI) {
return 'result';
}
// ... more functions included not displayed.
});
}));
it('can get an instance of my factory', inject(function(TestThisService) {
expect(TestThisService).toBeDefined();
}));
});
My question is what do I need to do to get my unit test to pass successfully?
Upvotes: 4
Views: 5376
Reputation: 8167
In the code you gave you have 2 typos, but I guess this isn't your real code:
Test Code, line 4:
beforeEach(module('MyApp.Module'));
should be:
beforeEach(module('myApp.Module'));
And line 13, you forgot a quote at: return 'test';
As the error you get is "TestThisServiceProvider...", I would use $injector
in a beforeEach
to inject your service to test. Just after the second beforeEach(module(function(){...});
beforeEach(inject(function($injector) {
myService = $injector.get('TestThisService');
}));
I think $injector
take care of the dependencies (like ngResource
in your case).
Upvotes: 2