模拟$ injector服务

时间:2015-03-25 21:12:37

标签: angularjs unit-testing dependency-injection mocking jasmine

我有一种情况,我想在模块中添加服务,因为我可能事先不知道它们是什么。从查看文档来看,执行此操作(没有全局范围)的唯一方法是使用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函数期间手动添加依赖项,但这不会复制实际行为。我可能无法测试该功能,但我不会测试该功能。

0 个答案:

没有答案