簡體   English   中英

在 Jasmine 中對 Angular 進行單元測試時,模擬注入到提供者中的自定義提供者

[英]Mocking custom provider injected into provider when unit testing Angular in 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 模擬之外,我的代碼中的所有內容都可以正常工作。

在這種情況下,最好只模擬返回值而不是提供者。

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM