2015-06-23 9 views
27

मैं अपने कोणीय अनुप्रयोग में एक सेवा है एक कोणीय सेवा है कि कुछ इस तरह दिखता में 'निजी' कार्यों का परीक्षण करने के लिए:साथ कर्मा और जैस्मीन

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

लेकिन यह कैसे मैं तुलना, फिल्टर और createBrackets कार्यों कि वापसी कथन द्वारा उजागर नहीं कर रहे हैं परीक्षण करते हैं?

धन्यवाद!

उत्तर

29

उन कार्यों का परीक्षण करने का कोई तरीका नहीं है। उनका दायरा वह कार्य है जिसमें आपके ब्रैकेट सेवा कारखाने शामिल हैं और वे कहीं और अदृश्य हैं। यदि आप उनका परीक्षण करना चाहते हैं, तो आपको उन्हें किसी भी तरह बेनकाब करना होगा।

आप उन्हें अपनी सेवा में ले जा सकते हैं (जो ओवरकिल जैसा लगता है) या आप ब्लैक बॉक्स को अपने ब्रैकेट सेवा सेवा का परीक्षण कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि आंतरिक कार्य काम कर रहे हैं। यह शायद सबसे समझदार दृष्टिकोण है।

यदि आप उन्हें एक अलग सेवा में नहीं रखना चाहते हैं, लेकिन फिर भी उन आंतरिक कार्यों का परीक्षण करने की आवश्यकता महसूस होती है, तो उन्हें वापस रिटर्न ब्रैकेट के साथ कारखाने से वापस कर दें।

मैं ऐसा कर सकता हूं जब मेरे पास कई सहायक कार्य हैं जो व्यक्तिगत रूप से परीक्षण करने के लिए सीधे आगे हैं, लेकिन ब्लैक बॉक्स टेस्ट में एक संयोजक पेंडोरा बॉक्स खोलें। मैं आमतौर पर ऐसे कार्यों को "_" के साथ पेश करता हूं ताकि वे यह दिखा सकें कि वे सहायक कार्य हैं और केवल परीक्षण के लिए सामने आए हैं।

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

आप उन कार्यों को किसी भी तरह उजागर किए बिना कॉल करने में सक्षम नहीं होंगे। लेकिन, आईएमएचओ, निजी तरीकों में यूनिट टेस्ट पर्स नहीं होना चाहिए, लेकिन उस समय परीक्षण किया जाना चाहिए जब सार्वजनिक विधि उन्हें कॉल किया जाता है। आपको क्या करना चाहिए उन वस्तुओं को नकल करना जो आपके निजी समारोह को प्राप्त करेंगे और आप उन पर अपेक्षाएं करने में सक्षम होंगे।

3

आपके वर्तमान सेटअप में उनका परीक्षण करने का एकमात्र तरीका लौटाए गए फ़ंक्शन का परीक्षण करना है क्योंकि वे वर्तमान में BracketService के दायरे में स्थानीय हैं। यदि आप उन्हें व्यक्तिगत रूप से परीक्षण योग्य बनाना चाहते हैं, तो आपको उन्हें BracketService की संपत्तियों के रूप में वापसी विवरण में बेनकाब करना होगा।

संबंधित मुद्दे