programing

Karma 및 Jasmine을 사용한 각도 서비스에서의 '프라이빗' 기능 테스트 방법

newnotes 2023. 3. 26. 11:46
반응형

Karma 및 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;
        }
    };

}]);

반품 명세서에 기재되어 있는 기능/특성뿐만 아니라 반품 명세서에 기재되어 있지 않은 기능까지 테스트하고 싶습니다.

현재 테스트는 다음과 같이 설정되어 있습니다.

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 함수를 테스트하려면 어떻게 해야 합니까?

감사합니다!

그 기능을 테스트할 방법은 없습니다.그 범위는 Bracket Service 팩토리를 구성하는 기능으로 다른 곳에서는 보이지 않습니다.테스트하려면 어떻게 해서든 노출시켜야 해

자체 서비스로 이동하거나(과잉으로 생각됨), 내부 기능이 작동하는지 확인하기 위해 충분한 데이터 조합을 사용하여 Bracket Service 서비스를 블랙박스로 테스트할 수 있습니다.그게 아마 가장 합리적인 방법일 거예요.

별도의 서비스를 원하지 않지만 내부 기능을 테스트할 필요가 있다고 생각되면 returnBrackets와 함께 공장에서 반품하십시오.

개별적으로 테스트하기 쉬운 도우미 기능이 여러 개 있지만 조합적인 Pandora's 박스에서 블랙박스 테스트를 여는 경우 이 작업을 수행할 수 있습니다.저는 보통 이러한 함수의 선두에 "_"를 붙여 도우미 함수임을 나타내며 테스트용으로만 노출됩니다.

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

그 함수는 어떻게든 공개하지 않으면 호출할 수 없습니다.단, IMHO, 개인 메서드는 유닛테스트가 아니라 이들을 호출하는 공용 메서드가 테스트될 때 테스트되어야 합니다.프라이빗 기능이 수신하는 오브젝트를 조롱하면 그 오브젝트에 대한 기대를 실행할 수 있습니다.

현재 셋업에서 테스트하는 유일한 방법은 반환된 함수를 테스트하는 것입니다.이 함수는 현재 내부 스코프에 로컬로 존재하기 때문입니다.BracketService개별적으로 테스트할 수 있도록 하려면 반품 명세서에 다음 속성으로 표시해야 합니다.BracketService.

언급URL : https://stackoverflow.com/questions/31013335/how-to-test-private-functions-in-an-angular-service-with-karma-and-jasmine

반응형