2015-06-23 18 views
27

Tôi có một dịch vụ trong ứng dụng góc của tôi trông giống như thế này:Làm thế nào để kiểm tra chức năng 'tư nhân' trong một dịch vụ góc với Karma và 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; 
     } 
    }; 

}]); 

Tôi muốn đơn vị kiểm tra không chỉ là chức năng/các thuộc tính được hiển thị trong câu lệnh trả về, nhưng cũng có các hàm nằm ngoài câu lệnh trả về.

thử nghiệm của tôi hiện đang thiết lập một cái gì đó như thế này:

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); 
    })); 
}); 

Nhưng làm thế nào để kiểm tra so sánh, chức năng lọc và createBrackets không được tiếp xúc bởi câu lệnh return?

Cảm ơn!

Trả lời

29

Không có cách nào để kiểm tra các chức năng đó. Phạm vi của họ là chức năng bao gồm nhà máy BracketService của bạn và họ không nhìn thấy bất kỳ nơi nào khác. Nếu bạn muốn thử nghiệm chúng, thì bạn phải phơi bày chúng bằng cách nào đó.

Bạn có thể chuyển chúng vào dịch vụ của riêng chúng (có vẻ như quá mức cần thiết) hoặc hộp đen có thể kiểm tra dịch vụ BracketService của bạn với đủ kết hợp dữ liệu để đảm bảo chức năng nội bộ đang hoạt động. Đó có lẽ là cách tiếp cận hợp lý nhất.

Nếu bạn không muốn đặt chúng trong một dịch vụ riêng biệt, nhưng vẫn cảm thấy cần phải kiểm tra các chức năng nội bộ đó, chỉ cần trả lại chúng từ nhà máy cùng với returnBrackets.

Tôi có thể làm điều này khi tôi có một số chức năng trợ giúp được chuyển tiếp để kiểm tra riêng lẻ, nhưng mở hộp tổ hợp Pandora để kiểm tra hộp đen. Tôi thường bắt đầu các hàm như vậy với dấu "_" để chỉ ra rằng chúng là các hàm trợ giúp và chỉ được tiếp xúc để thử nghiệm.

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

Bạn sẽ không thể gọi các chức năng đó mà không hiển thị chúng bằng cách nào đó. Tuy nhiên, IMHO, các phương thức riêng không nên có một kiểm tra đơn vị, nhưng được kiểm tra tại thời điểm phương thức công khai gọi chúng là được kiểm tra. Những gì bạn nên làm là giả lập các đối tượng mà chức năng riêng tư của bạn sẽ nhận được và bạn sẽ có thể thực hiện các kỳ vọng trên chúng.

3

Cách duy nhất để kiểm tra chúng trong thiết lập hiện tại của bạn là kiểm tra hàm trả về vì chúng hiện tại là cục bộ với phạm vi bên trong BracketService. Nếu bạn muốn chúng được thử nghiệm riêng lẻ, bạn sẽ cần hiển thị chúng trong câu lệnh trả về dưới dạng thuộc tính của BracketService.

Các vấn đề liên quan