在Jasmine单元测试Angular时,模拟自定义提供程序注入提供程序

时间:2015-06-26 08:38:10

标签: javascript angularjs unit-testing jasmine

我在Jasmine中对提供商进行单元测试,该提供商依赖于其他提供商。没有与此提供商关联的配置。在嘲笑提供者时,我已经读过你应该使用像

这样的东西
beforeEach(module(function ($provide) {
    mockInjectedProvider = { };
    $provide.value('injected', mockInjectedProvider );
}));

在将自定义提供程序注入服务时可以正常工作。将它们注入提供者时,它并不起作用。代码不会失败,但是在测试时执行的是实际的提供者,而不是模拟的提供者。下面是抽象的例子。

var mockInjectedProvider;

beforeEach(function () {
    module('myModule');
});

beforeEach(module(function ($provide) {
    mockInjectedProvider = {
        myFunc: function() {
            return "testvalue"
            }
        }
    };
    $provide.value('injected', mockInjectedProvider );
}));

beforeEach(inject(function (_base_) {
    baseProvider = _base_;
}));

it("injectedProvider should be mocked", function () {
    var resultFromMockedProvider = baseProvider.executeMyFuncFromInjected();
    expect(resultFromMockedProvider).toEqual("testvalue");
}); // Here instead of using my mock it executes the actual dependency

$provide.value声明中,我尝试了同时包含injectedinjectedProvider,以及使用$provide.provider和模拟$get函数它似乎没什么用。我无法让它模仿实际的提供者。抽象的基础提供商看起来像这样。

(function (ng, module) {
    module.provider("base",
        ["injectedProvider", function (injectedProvider) {
            this.executeMyFuncFromInjected= function() {
                return injectedProvider.myFunc(); // let's say this returns "realvalue"
            }
            this.$get = function () {
                return this;
            };
        }]
    );
})(window.angular, window.angular.module("myModule"));

我的代码中的所有内容都在运行,除了Jasmine模拟。

1 个答案:

答案 0 :(得分:2)

在这种情况下,最好只模拟返回值而不是提供者。

  var mockInjectedProvider;

beforeEach(function () {
    module('myModule');
});

beforeEach(inject(function (_injected_) { 
  spyOn(_injected_, "myFunc").and.returnValue("testvalue");
}));

beforeEach(inject(function (_base_) {
    baseProvider = _base_;
}));

it("injectedProvider should be mocked", function () {
    var resultFromMockedProvider = baseProvider.executeMyFuncFromInjected();
    expect(resultFromMockedProvider).toEqual("testvalue");
}); // Here instead of using my mock it executes the actual dependency