AngularJS: 如何测试工厂
AngularJS: How to test Factories
我有一个 session.factory.js
工厂:
(function() {
'use strict';
angular
.module('app')
.factory('Session', Session);
function Session() {
var sessionId;
return {
create: create,
destroy: destroy,
isAuthenticated: isAuthenticated
};
function create(id) {
sessionId = id
}
function destroy() {
sessionId = null;
}
function isAuthenticated() {
return !!sessionId;
}
}
})();
我想测试一下,所以我做了一个 session.factory.spec.js
:
describe('Session', function() {
var Session;
beforeEach(function(){
module('app');
inject(function(_Session_){
Session = _Session_;
});
});
});
但是由于某些原因 Session
是 undefined
。我缺少什么?
你只需要像这样加载你的模块:
describe('Session', function() {
var Session;
beforeEach(module('app')); //added
beforeEach(inject(function(_Session_){
Session = _Session_;
});
});
module('app')
returns 然后在每个函数之前调用的函数。按照您在 OP 中的方式,该函数是通过从未调用创建的。
inject
也是一样。它应该直接位于 beforeEach
内。
编辑:
上面的代码是通常的做法,但原来你也可以定义module
和inject
函数OP 正在做。
在building a plunker for this question之后,我可以看出问题不在测试的定义中。其实是模块定义方式的问题
这一行:
angular
.module('app')
.factory('Session', Session);
应该是这样的:
angular
.module('app', [])
.factory('Session', Session);
[]
很重要,因为它表示这是 root 模块(或应用程序)。如果没有这个,该模块将被视为依赖模块并且无法正确创建。
我有一个 session.factory.js
工厂:
(function() {
'use strict';
angular
.module('app')
.factory('Session', Session);
function Session() {
var sessionId;
return {
create: create,
destroy: destroy,
isAuthenticated: isAuthenticated
};
function create(id) {
sessionId = id
}
function destroy() {
sessionId = null;
}
function isAuthenticated() {
return !!sessionId;
}
}
})();
我想测试一下,所以我做了一个 session.factory.spec.js
:
describe('Session', function() {
var Session;
beforeEach(function(){
module('app');
inject(function(_Session_){
Session = _Session_;
});
});
});
但是由于某些原因 Session
是 undefined
。我缺少什么?
你只需要像这样加载你的模块:
describe('Session', function() {
var Session;
beforeEach(module('app')); //added
beforeEach(inject(function(_Session_){
Session = _Session_;
});
});
module('app')
returns 然后在每个函数之前调用的函数。按照您在 OP 中的方式,该函数是通过从未调用创建的。
inject
也是一样。它应该直接位于 beforeEach
内。
编辑:
上面的代码是通常的做法,但原来你也可以定义module
和inject
函数OP 正在做。
在building a plunker for this question之后,我可以看出问题不在测试的定义中。其实是模块定义方式的问题
这一行:
angular
.module('app')
.factory('Session', Session);
应该是这样的:
angular
.module('app', [])
.factory('Session', Session);
[]
很重要,因为它表示这是 root 模块(或应用程序)。如果没有这个,该模块将被视为依赖模块并且无法正确创建。