我们为具有许多服务的Angular应用程序编写了一套单元测试。提供虚拟服务实现(通常无效)插入应用程序模块很方便,例如:
'use strict';
describe('ServiceUnderTest', function () {
beforeEach(module('app', FakeServiceA, FakeServiceB));
...
}
// Fake service implementations (global functions):
function FakeServiceA($provide) {
$provide.value(
'ServiceA'
{ foo: function () {} }
);
}
function FakeServiceB($provide) {
$provide.value(
'ServiceB'
{ bar: function () {} }
);
}
现在,如果我希望他们实际上做某事而不是什么,例如拒绝承诺,我就会遇到注入依赖的问题。我想要的是:
function FakeServiceA($provide, $q) {
$provide.value(
'ServiceA'
{ foo: function () { return $q.reject('Nope!'); } }
);
}
但似乎不可能以这种方式注入$q
。注册模块时有没有其他方法可以实现?
答案 0 :(得分:1)
$ q无法以这种方式注入
function FakeServiceA($provide, $q) { ...
因为指定的依赖项是由提供者注入器注入的,如here所述(可以使用$provide
的事实可以提示),而服务实例($ q)必须是由实例注入器注入。显然,它无法注入$q
,因为此时它并未从$qProvider
实例化。
必须是这样的:
function FakeServiceA($provide) {
$provide.factory('ServiceA', function ($q) {
return { foo: function () { return $q.reject('Nope!'); } }
});
}