javascript 使用 Karma (Jasmine) 测试 AngularJS 工厂
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25002520/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Testing an AngularJS factory with Karma (Jasmine)
提问by chuckfinley
I'm struggling with testing an AngularJS factory using Karma + Jasmine.
我正在努力使用 Karma + Jasmine 测试 AngularJS 工厂。
I am unable to inject my factory to OfficerValidationService
variable.
我无法将我的工厂注入OfficerValidationService
变量。
What am i doing wrong?
我究竟做错了什么?
Note: the file is loaded properly
注意:文件已正确加载
Factory:
工厂:
'use strict';
angular.module('darthvader').factory('OfficerValidationService', [function(){
var OfficerValidationService = {};
OfficerValidationService.something = function() {
return true;
};
return OfficerValidationService;
}]);
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)
回答by martynas
You need to call angular.injector
:
您需要致电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();
});
});
}());
回答by Jean-Baptiste Bouhier
To add to martynas' answer, here is a simplified version:
要添加到martynas 的回答中,这里是一个简化版本:
module()
is the shorthand of angular.mock.moduleinject()
is the shorthand of angular.mock.inject(same as $injector)
module()
是的速记angular.mock.moduleinject()
被的速记angular.mock.inject(同$喷射器)
'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();
});
});
}());