茉莉花& Angular:将服务注入服务模拟

时间:2016-03-21 11:39:53

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

我们为具有许多服务的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。注册模块时有没有其他方法可以实现?

1 个答案:

答案 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!'); } }
    });
}