2014-05-07 4 views
11

मैं शोध कर रहा हूं कि कर्म के साथ जैस्मीन का उपयोग कैसे करें। मैं अपने नियंत्रक में और कहीं से मैं इस कोड उठाया है एक गुंजाइश इंजेक्षन करने की कोशिश कर रहा हूँ ...

var scope = { message: 'hello' }; 

beforeEach(angular.mock.module('myApp')); 

beforeEach(angular.mock.inject(function ($rootScope, $controller) { 

    scope = $rootScope.$new(); 

    $controller('myController', { $scope: scope }); 

})); 

समस्या यह है कि गुंजाइश लाइन के साथ नष्ट किया जा रहा है ...

scope = $rootScope.$new(); 

तो मैं इसे टिप्पणी कर सकता हूं लेकिन मुझे आश्चर्य है कि इस लाइन का उपयोग किस लिए है? मैं $rootscope.$new() पर कब कॉल करना चाहूंगा? मैं समझता हूं कि अलगाव के साथ करना है, लेकिन मुझे वास्तव में इसके व्यावहारिक अनुप्रयोग नहीं मिलते हैं।

अपडेट: जैसा कि नीचे टिम पॉइंट नीचे है, एक समस्या है क्योंकि मैंने अपना खुद का दायरा घोषित कर दिया है। इसलिए मैं होने के लिए कोड को संशोधित कर सकते हैं ....

var scope; 

beforeEach(angular.mock.module('myApp')); 

beforeEach(angular.mock.inject(function ($rootScope, $controller) { 

    scope = $rootScope.$new(); 

    scope.message = 'hello'; 

    $controller('myController', { $scope: scope }); 

})); 

और वह अधिक की उम्मीद की तरह काम करता है, लेकिन मैं अभी भी सोच रहा हूँ क्या सबसे अच्छा तरीका है? $rootscope.$new() के लिए भी क्या है?

+0

'समस्या गुंजाइश line' मैं वास्तविक 'समस्या' लगता है कि साथ नष्ट किया जा रहा है है कि आप * परिभाषित किया गया है * आपका स्वयं का 'var scope' –

+0

ठीक है जो अब समझ में आता है। इसके साथ दिमाग में सबसे अच्छा तरीका कौन सा है? – Exitos

+0

आप यमन का उपयोग क्यों नहीं करते हैं और इसे अपनी चमेली/कर्म कॉन्फ़िगरेशन सेट अप करने दें? – mortsahl

उत्तर

3

कोणीय में कार्यक्षेत्र माता-पिता बच्चे के सम्बन्ध में नेस्ट कर रहे हैं, सभी एक ही माता पिता $rootScope

यह वह जगह है से पाने कैसे कोणीय बनाता $scope है कि आपके नियंत्रक में इंजेक्शन हो जाता है तो यह एक ही अनुभव है जब आप इकाई परीक्षण कर रहे हैं बनाता है आपके नियंत्रक।

यह विशेष रूप से उपयोगी है यदि आप अपने नियंत्रक में कुछ भी कर रहे हैं जिसके लिए आपको उस पर नकल करने के बजाए $ आवेदन करने की आवश्यकता है।

11

$rootScope.$new$rootScope.Scope का एक नया उदाहरण बनाता है जो $rootScope से प्राप्त होता है। दूसरे शब्दों में, यह $rootScope का एक नया बाल दायरा बनाता है।

कारणों में आप इसका उपयोग कर सकते हैं (जैसे कि आपने पोस्ट किया है), क्योंकि आपका अन्य विकल्प $rootScope का उपयोग करना है। ऐसा करने से गड़बड़ी हो सकती है क्योंकि यह पूरे स्थान पर इस्तेमाल किया जा सकता है।

मैं प्रत्येक टेस्ट केस के लिए एक नया दायरा बनाने (और बाद में नष्ट करने) के लिए सर्वोत्तम अभ्यास मानता हूं।

यहाँ अपने उदाहरण मैं क्या एक सबसे अच्छा अभ्यास पर विचार करने के फिर से लिखा है:

describe('myModule', function() { 

    var $rootScope; 

    beforeEach(module('myModule')); 

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

    describe('myController', function() { 

     var $scope; 

     beforeEach(function createChildScopeForTheTest() { 
      $scope = $rootScope.$new(); 
     }); 

     afterEach(function disposeOfCreatedChildScope() { 
      $scope.$destroy(); 
     }); 

     it('tests something', function() { 
      $scope.message = 'hello'; 

      $controller('myController', { $scope: $scope }); 

      expect($scope.something).toEqual('world'); 
     }); 
    }); 
}); 
+0

मुझे यह उदाहरण पसंद है। हालांकि एक मुद्दा, अगर मैं प्रत्येक ब्लॉक के बाद में दायरे को नष्ट करने की कोशिश करता हूं तो मुझे एक त्रुटि मिलती है। ऐसा लगता है कि उस बिंदु पर दायरा पहले से ही साफ हो गया है और नष्ट हो गया है। – SuneRadich

+1

मैं इसे अपने सभी परीक्षणों में उपयोग कर रहा हूं, जिनमें से मेरे पास 10000 से अधिक है। मैंने इस समस्या में कभी भाग नहीं लिया।यह आपके परीक्षण में कुछ और करने के कारण हो सकता है। अगर आप फिक्सिंग में मदद चाहते हैं तो कुछ कोड पोस्ट करें :-) – eitanfar

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