簡體   English   中英

如何使用Karma和Jasmine在角度服務中測試“私有”功能

[英]How to test 'private' functions in an angular service with Karma and Jasmine

我在我的角應用程序中有一個服務,看起來像這樣:

angular.module('BracketService', []).factory('BracketService', [function() {
    function compareByWeight(a, b) {
        return a.weight - b.weight;
    }
    function filterWeightGroup(competitors, lowWeight, highWeight) {
        //filter stuff
    }
    function createBracketsByWeightGroup(weightGroup) {
        //create some brackets
    }
    //set some base line values
    var SUPER_HEAVY_WEIGHT = 500;
    var SUPER_LIGHT_WEIGHT = 20;
    return {
        //create brackets from a list of competitors
        returnBrackets: function(competitors) {
            var brackets = {};
            //get super light weights
            brackets.superLightWeights = createBracketsByWeightGroup(
                filterWeightGroup(competitors, 0, SUPER_LIGHT_WEIGHT)
                .sort(compareByWeight)
            );
            brackets.superHeavyWeights = createBracketsByWeightGroup(
                filterWeightGroup(competitors, SUPER_HEAVY_WEIGHT, Infinity)
                .sort(compareByWeight)
            );
            brackets.middleWeights = createBracketsByWeightGroup(
                filterWeightGroup(competitors, SUPER_LIGHT_WEIGHT, SUPER_HEAVY_WEIGHT)
                .sort(compareByWeight)
            );
            return brackets;
        }
    };

}]);

我想不僅單元測試return語句中公開的函數/屬性,還要測試return語句之外的函數。

我的測試目前設置如下:

describe('BracketService', function() {
    beforeEach(module('bracketManager'));

    it('calling return brackets with no competitors will return 3 empty weight classes', inject(function(BracketService) {
        var mockCompetitors = [];
        var mockBracketResult = {superHeavyWeights: [[]], superLightWeights: [[]], middleWeights: [[]]};
        expect(BracketService.returnBrackets(mockCompetitors)).toEqual(mockBracketResult);
    }));
});

但是,如何測試return語句未公開的compare,filter和createBrackets函數?

謝謝!

沒有辦法測試這些功能。 它們的范圍是包含BracketService工廠的功能,它們在任何其他地方都是不可見的。 如果你想測試它們,那么你必須以某種方式暴露它們。

您可以將它們移動到自己的服務中(這似乎有點過分),或者您可以使用足夠的數據組合對您的BracketService服務進行黑盒測試,以確保內部功能正常工作。 這可能是最明智的做法。

如果您不想將它們放在單獨的服務中,但仍然覺得需要測試這些內部函數,只需將它們與returnBrackets一起從工廠返回。

當我有一些直接單獨測試的輔助函數時,我可能會這樣做,但打開一個組合潘多拉盒子到黑盒子測試。 我通常用“_”來表示這些函數,以表明它們是輔助函數,並且僅用於測試。

return {
    //create brackets from a list of competitors
    returnBrackets: function(competitors) {...},
    _filterWeightGroup: filterWeightGroup,
    _createBracketsByWeightGroup: createBracketsByWeightGroup
   };

如果不以某種方式暴露它們,您將無法調用這些函數。 但是,恕我直言,私有方法不應該有單元測試perse,但在測試它們的公共方法時進行測試。 你應該做的是模擬你的私人功能將收到的對象,你將能夠對它們表現出期望。

在當前設置中測試它們的唯一方法是測試返回的函數,因為它們當前是BracketService內部作用域的本地BracketService 如果您希望它們可單獨測試,則需要在return語句中將它們作為BracketService屬性BracketService

暫無
暫無

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

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