我有一个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
。我缺少什么?
答案 0 :(得分:3)
您只需要像这样加载模块:
describe('Session', function() {
var Session;
beforeEach(module('app')); //added
beforeEach(inject(function(_Session_){
Session = _Session_;
});
});
module('app')
返回一个函数,然后在每个函数之前调用该函数。你在OP中拥有它的方式,该函数是从未被调用过的。
inject
是一样的。它应该直接位于beforeEach
内。
修改强>
以上代码是通常的方式,但事实证明,您也可以按照OP的方式定义module
和inject
函数。
在building a plunker for this question之后,我可以看到问题不在于测试的定义。这实际上是模块定义方式的一个问题。
这一行:
angular
.module('app')
.factory('Session', Session);
应该是这样的:
angular
.module('app', [])
.factory('Session', Session);
[]
非常重要,因为它表示这是 root 模块(或应用)。如果没有这个,模块将被视为依赖模块,而不是正确创建。