我有一种情况,我想在模块中添加服务,因为我可能事先不知道它们是什么。从查看文档来看,执行此操作(没有全局范围)的唯一方法是使用Angular的$injector
服务。但是,似乎这个服务不可模仿,这是有道理的,因为它是Angular本身获取依赖关系的方式,即使在测试中它仍然很重要。
基本上,我正在模仿NodeJS
的{{1}}模块。我希望有一个类似钥匙串的东西,你可以在运行时添加或删除一个帐户。到目前为止,我有这个:
passport
但是,每当我尝试模仿angular.module('myModule').factory('accounts', function($injector) {
return {
add: function(name) {
if(!$injector.has(name) {
$log.warn('No Angular module with the name ' + name + ' exists. Aborting...');
return false;
}
else {
this.accounts[name] = $injector.get(name);
return true;
}
},
accounts: []
};
});
中的$injector
函数时,就像这样:
Jasmine
第二次测试失败,因为describe('accounts', {
var $injector;
var accounts;
beforeEach(function() {
$injector = {
has: jasmine.createSpy(),
get: jasmine.createSpy()
};
module(function($provide) {
$provide.value('$injector', $injector);
});
module('ngMock');
module('myModule');
inject(function(_accounts_) {
accounts = _accounts_;
});
});
describe('get an account', function() {
describe('that exists', function() {
beforeEach(function() {
$injector.has.and.returnValue(true);
});
it('should return true', function() {
expect(accounts.add('testAccount')).toEqual(true);
});
});
describe('that doesn't exist', function() {
beforeEach(function() {
$injector.has.and.returnValue(false);
});
it('should return true', function() {
expect(accounts.add('testAccount')).toEqual(false);
});
});
});
});
服务正在调用实际的accounts
服务,而不是模拟。我可以在测试期间或服务中调用$injector
或$injector.get
来确认这一点。
我该怎么办?似乎没有其他方法可以添加新的依赖项,但这正是我想要做的。我错了吗?实际上是否存在另一种方法,而不使用$injector.has
?
假设我是对的,没有其他方法可以做我想做的事情,我应该如何测试这个功能?我可以相信$injector
服务可以完成它的工作,但我仍然想为测试模拟它。我可以在$injector
函数期间手动添加依赖项,但这不会复制实际行为。我可能无法测试该功能,但我不会测试该功能。