2015-09-15 14 views
5

मैं यूनिट परीक्षण के लिए नया हूं और मुख्य रूप से उन उदाहरणों से सीख रहा हूं जो मुझे मिलते हैं। समस्या यह है कि मैंने कई अलग-अलग पैटर्न देखे हैं कि यह समझना मुश्किल है कि उनके बीच मतभेद क्या हैं। और विभिन्न उपयोग मामलों के लिए उन पैटर्न को कैसे गठबंधन करें। नीचे ऐसे ही एक पैटर्न है:एंगुलरजेएस यूनिट परीक्षण - निर्भरता इंजेक्शन के लिए विभिन्न पैटर्न

var $rootScope, $window, $location; 
    beforeEach(angular.mock.module('security.service', 'security/loginModal.tpl.html')); 

    beforeEach(inject(function(_$rootScope_, _$location_) { 
     $rootScope = _$rootScope_; 
     $location = _$location_; 
    })); 

    var service, queue; 
    beforeEach(inject(function($injector) { 
     service = $injector.get('security'); 
     queue = $injector.get('securityRetryQueue'); 
    })); 
इस पैटर्न से

तो, मैं gleaned है कि कोणीय मुख्य सेवाओं/प्रदाताओं अंडरस्कोर पैटर्न जहां के रूप में अन्य 3 पार्टी निर्भरता या अपने ही निर्भरता का उपयोग किया जाना चाहिए इंजेक्शन किया जाना चाहिए $ इंजेक्टर.get() पैटर्न। क्या यह मान्य है? मैंने देखा है कि मैं कोणीय कोर सेवाओं के साथ $ इंजेक्टर.get() कर सकता हूं और यह अभी भी काम करेगा, शायद यह इस तरह से करने के लिए सिर्फ सम्मेलन है? साथ ही, beforeEach(angular.mock.module('security.service', 'security/loginModal.tpl.html')); में 'सुरक्षा/loginModal.tpl.html' का बिंदु क्या है? मुझे पता है कि यह एक HTML टेम्पलेट टेम्पलेट कैश में जोड़ा गया है लेकिन angular.mock.module इसके साथ क्या कर रहा है?

मैं भी इस कम आम पैटर्न है कि इसके बाद के संस्करण तर्क में एक बंदर रिंच फेंक देखा है:

beforeEach(inject(function($injector, _$location_) { 
     security = $injector.get('security'); 
     $location = _$location_; 
    })); 

मैं सिर्फ इस कोड की तरह इंजेक्षन कॉलबैक करने के लिए सेवाओं को जोड़ने कर सकते हैं $ स्थान के साथ करता है, कि लगता है संदर्भ निर्भरताओं का एक आसान तरीका की तरह। मुझे ऐसा क्यों नहीं करना चाहिए?

beforeEach(function() { 
     module('security.service', function($provide) { 
      $provide.value('$window', $window = jasmine.createSpyObj('$window', ['addEventListener', 'postMessage', 'open'])); 
     }); 

     inject(function(security) { 
      service = security; 
     }); 
    }); 

मेरी समझ से, इस पद्धति की बात एक मज़ाक उड़ाया $ खिड़की के साथ "security.service" मॉड्यूल प्रारंभ करने में है:

यहाँ एक और पैटर्न है। यह समझ में आता है, लेकिन मैं पिछले पैटर्न के साथ इस पैटर्न को कैसे फिट कर सकता हूं? यानी मैं 'सुरक्षा/लॉगिन Modal.tpl.html' का नकल कैसे करूं, मैं अपने कोणीय कोर निर्भरताओं + मेरी अन्य निर्भरताओं को कैसे इंजेक्ट करूं?

आखिरकार, मैं नेस्टेड वर्णन में इंजेक्ट नहीं कर सकता और यह ब्लॉक कर सकता हूं? क्या यह मानना ​​सुरक्षित है कि मैं मॉड्यूल में मैक की गई सेवाओं को रेट्रो-इंजेक्ट नहीं कर सकता हूं। तो फिर मैं इंजेक्ट कर सकता हूं और उपयोग के मामले क्या हैं?

यदि AngularJS इकाई परीक्षण प्रारंभिकरण के लिए एक निश्चित दस्तावेज़ीकरण स्रोत है जो इन सवालों के जवाब देने में मदद करेगा, तो कृपया मुझे इंगित करें।

उत्तर

2

मैं gleaned है कि कोणीय मुख्य सेवाओं/प्रदाताओं अंडरस्कोर पैटर्न जहां के रूप में अन्य 3 पार्टी निर्भरता या अपने ही निर्भरता $ injector.get का उपयोग किया जाना चाहिए() पैटर्न के साथ इंजेक्शन दिया जाना चाहिए

आप या तो उपयोग कर सकते हैं। underscore पैटर्न एक ही नाम के स्थानीय चर के साथ संघर्ष से बचने के लिए बस एक सुविधाजनक तरीका है। निम्नलिखित

var $rootScope, myService, http; // these are local variables 

beforeEach(inject(function(_$rootScope_, _myService_, $http) { 
    $rootScope = _$rootScope_; // underscores to avoid variable name conflict 
    myService = _myService_; // same here with your custom service 
    http = $http; // local variable is named differently to service 
})); 

पर विचार करें मैं सिर्फ इस कोड को $ स्थान के साथ करता है, कि निर्भरता को संदर्भित करने का एक सरल तरीका की तरह लगता है की तरह इंजेक्षन कॉलबैक के लिए सेवाएं जोड़ सकते हैं। मुझे ऐसा क्यों नहीं करना चाहिए?

आप :) चाहिए


इसके अलावा, beforeEach(angular.mock.module('security.service', 'security/loginModal.tpl.html')); में 'सुरक्षा/loginModal.tpl.html' की बात क्या है?

जहाँ तक मुझे पता है, जब तक कि आप उस नाम के साथ एक वास्तविक मॉड्यूल है, जैसे

angular.module('security/loginModal.tpl.html', []) 

इस असफल हो जायेगी। angular.mock.module केवल मॉड्यूल नाम, उदाहरण या अज्ञात प्रारंभिक कार्यों को पारित किया जाना चाहिए।


मैं कैसे नकली 'सुरक्षा/loginModal.tpl.html'

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

तुम सिर्फ HTTP पर टेम्पलेट्स (आमतौर पर निर्देश परीक्षण से) लोड करने का प्रयास से कर्मा को रोकने की कोशिश कर रहे हैं, तो आप karma-ng-html2js-preprocessor


अन्त में की तरह एक टेम्पलेट पूर्व प्रोसेसर का उपयोग कर सकते हैं, क्या कर सकते हैं मैं और नेस्टेड वर्णन में इंजेक्ट नहीं कर सकता और यह ब्लॉक करता है? क्या यह मानना ​​सुरक्षित है कि मैं मॉड्यूल में मैक की गई सेवाओं को रेट्रो-इंजेक्ट नहीं कर सकता हूं। तो फिर मैं इंजेक्ट कर सकता हूं और उपयोग के मामले क्या हैं?

तुम बस के बारे में कहीं भी (आमतौर पर beforeEach और it) angular.mock.inject चला सकते हैं। मॉक सेवाओं को केवल मॉड्यूल या अज्ञात मॉड्यूल प्रारंभिक फ़ंक्शन में कॉन्फ़िगर किया जाना चाहिए (जैसा कि $provide और $window के साथ आपके उदाहरण में) और आमतौर पर के बाद अपने स्वयं के मॉड्यूल (यानी "security.service") वास्तविक सेवाओं को ओवरराइड करने के लिए कॉन्फ़िगर किया जाना चाहिए इंजेक्टर में उन्हें बदलकर। एक बार जब आप inject() चलाते हैं, तो आप एक नकली के साथ एक सेवा को रेट्रो-सक्रिय रूप से प्रतिस्थापित नहीं कर सकते हैं।

+0

धन्यवाद! मैं अब इसे बेहतर समझता हूं। – ravishi

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