Testing AngularJS factory with karma (jasmine)

I am struggling with testing AngularJS factory using Karma + Jasmine.

I cannot insert my factory variable in OfficerValidationService .

What am I doing wrong?

Note: file uploaded correctly

Factory:

 'use strict'; angular.module('darthvader').factory('OfficerValidationService', [function(){ var OfficerValidationService = {}; OfficerValidationService.something = function() { return true; }; return OfficerValidationService; }]); 

The code:

 'use strict'; (function() { describe('OfficerValidationService Spec', function() { var OfficerValidationService; beforeEach(function() { angular.module('darthvader'); }); beforeEach(module('darthvader', function($provide) { $provide.value('OfficerValidationService', OfficerValidationService); })); it('is very true', inject(function(OfficerValidationService){ alert('=====' + OfficerValidationService + '====='); var output = OfficerValidationService.something(); expect(output).toBeTruthy(); })); }); }()); 

Output:

 Running "karma:unit" (karma) task INFO [karma]: Karma v0.12.17 server started at http://localhost:9876/ INFO [launcher]: Starting browser PhantomJS INFO [PhantomJS 1.9.7 (Mac OS X)]: Connected on socket yc_qTseOCArRtZLAXSTZ with id 97647403 ALERT: '=====undefined=====' PhantomJS 1.9.7 (Mac OS X) OfficerValidationService Spec is very true FAILED TypeError: 'undefined' is not an object (evaluating 'OfficerValidationService.something') at /Users/chuck/Desktop/sandbox/dashboard.darthvader/test/karma/unit/services/officerValidationService.js:25 at invoke (/Users/chuck/Desktop/sandbox/dashboard.darthvader/public/lib/angular/angular.js:3917) at workFn (/Users/chuck/Desktop/sandbox/dashboard.darthvader/public/lib/angular-mocks/angular-mocks.js:2155) undefined PhantomJS 1.9.7 (Mac OS X): Executed 28 of 28 (1 FAILED) (0.102 secs / 0.131 secs) 
+7
javascript angularjs unit-testing karma-runner jasmine
source share
2 answers

You need to call angular.injector :

 'use strict'; (function() { describe('OfficerValidationService Spec', function() { var OfficerValidationService; beforeEach(function() { angular.module('darthvader'); }); beforeEach(inject(function() { var $injector = angular.injector(['darthvader']); OfficerValidationService = $injector.get('OfficerValidationService'); })); it('is very true', function(){ var output = OfficerValidationService.something(); expect(output).toBeTruthy(); }); }); }()); 
+13
source share

To add martynas to the answer , here is a simplified version:

module() is short for angular.mock.module
inject() is short for angular.mock.inject (same as $ injector )

 'use strict'; (function() { describe('OfficerValidationService Spec', function() { var OfficerValidationService; beforeEach(module('darthvader')); beforeEach(inject(function (OfficerValidationService) { OfficerValidationService = OfficerValidationService; })); it('OfficerValidationService should exist', function() { expect(OfficerValidationService).toBeTruthy(); }); }); }()); 
+1
source share

All Articles