簡體   English   中英

在angular.js應用程序的配置階段期間的Spyon提供程序

[英]Spyon provider during config phase in angular.js application

我正在為Angular.js應用程序(使用karma和jasmine)編寫單元測試,我想在模塊的CONFIG階段測試某個行為。 我想確認正在調用PROVIDER的某個功能。 我認為我可以通過提供者方法的間諜來做到這一點,但在“期望”之前獲得對提供者的訪問已被證明相當棘手。 這是一些示例代碼:

模塊代碼(正在測試)

var myApp = angular.module('myApp', ['restangular']);
myApp.config(['RestangularProvider', function (RestangularProvider) {
    RestangularProvider.setBaseUrl('http://someurl:someport/');
}]);

我已經嘗試了各種解決方案來獲取RestangularProvider的引用並對它應用間諜,並且都失敗了。 我能得到的最接近的代碼如下:

單元測試代碼

describe("Test if setBaseUrl was called", function () {
    var RestangularProvider;
    beforeEach(module('myApp', function(_RestangularProvider_) {
        RestangularProvider = _RestangularProvider_;
        spyOn(RestangularProvider, "setBaseUrl").and.callThrough();
    }));

    it("should call setBaseUrl.", function() {
        expect(RestangularProvider.setBaseUrl).toHaveBeenCalled();
    });
});

我實際上得到了RestangularProvider的引用,但在此之前調用了模塊的“config”函數,所以我認為間諜沒有得到設置。

我找到了一個帖子,其中作者通過測試配置的“服務”而不是測試對提供者方法的實際調用來解決類似情況的“解決方法”。 在上面的例子中,我將在我的期望中測試Restangular.configuration.baseUrl ,而不是測試對提供者的setBaseUrl方法的實際調用,但這似乎在某些情況下是不夠的。

我對Angular.js比較陌生,所以這可能僅僅是對整個“測試配置階段”完全無能為力的情況,所以如果是這樣的話,請隨意讓我直截了當:]

有什么建議,批評或指示?

我終於解決了這個問題,將我想要窺探的模塊分離出來,進入一個不同的“beforeEach”塊。 修改后的代碼如下所示,但我仍然希望對這是否真的是一個“充分的測試”的整個想法有任何意見。

describe("Test if setBaseUrl was called", function () {
    var RestangularProvider;
    //Setup the spy.
    beforeEach(function () {

      module("restangular", function(_RestangularProvider_) {
        RestangularProvider = _RestangularProvider_;
        spyOn(_RestangularProvider_, 'setBaseUrl').and.callThrough();
      });
    });

    beforeEach(module('myApp'));

    it("should call setBaseUrl.", function() {
        expect(RestangularProvider.setBaseUrl).toHaveBeenCalled();
    });
});

如上面的OP所述,您需要在調用要測試的模塊之前獲取提供程序。
但是,沒有必要將它們分成兩個beforeEach塊。 您還必須在beforeEach塊的末尾調用inject()函數(即使您沒有注入任何內容)。

describe('Test if setBaseUrl was called', function () {
  var RestangularProvider;
  //Setup the spy.
  beforeEach(function () {

    module('restangular', function(_RestangularProvider_) {
      RestangularProvider = _RestangularProvider_;
      spyOn(_RestangularProvider_, 'setBaseUrl').and.callThrough();
    });

    module('myApp');

    inject();
  });

  it('should call setBaseUrl.', function() {
    expect(RestangularProvider.setBaseUrl).toHaveBeenCalled();
  });
});

資料來源: http//java.dzone.com/articles/unit-testing-config-and-run

暫無
暫無

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

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