2015-07-05 13 views
8

मैं अंगुलरजेएस (एक और कहानी पूरी तरह से) के लिए कुछ टीडीडी पर काम कर रहा हूं और ऐसी परिस्थिति में भाग गया जहां मेरी पहले से प्रत्येक कॉल को निष्पादित नहीं किया जा रहा है। मैंने इसे नीचे दिए गए उदाहरण में घटा दिया।एंगुलरजेएस/कर्म परीक्षण: पहले से निष्पादित नहीं किया गया

यह काम करता है के रूप में तथ्य यह है कि beforeEach में console.log संदेशों और यह दोनों दिखाई देते हैं इसका सबूत:,

describe('userApp', function(){ 
    beforeEach(function(){ 
    console.log("in beforeEach..."); 
    }); 

    it('should be able to log something', function(){ 
    console.log("in it..."); 
    }); 
}); 

यह काम नहीं करता के रूप में तथ्य यह है कि इसका सबूत में console.log संदेश beforeEach प्रदर्शित किया जाता है नहीं और यह विफल रहता है जब $ log.info करने का प्रयास और फेंकता त्रुटि संदेश: TypeError: Cannot read property 'info' of undefined

describe('userApp', function(){ 
    var $log; 
    beforeEach(module('userApp', function($provide) { 
    console.log("in beforeEach..."); 
    // Output messages 
    $provide.value('$log', console); 
    })); 
    it('should be able to log something', function(){ 
    console.log("in it..."); 
    $log.info("Using $log for logging..."); 
    }); 
}); 

मैं कोणीय 1.3.15, कर्म 0.12.31, चमेली 2.3.4 का उपयोग कर रहा हूँ। शायद कुछ स्पष्ट मैं देख रहा हूं ...

संपादित करें: माइकल रेडियोनोव की व्याख्या बहुत उपयोगी है; हालांकि, मुझे समझ में नहीं आता कि यह संशोधित कोड अभी भी एक ही त्रुटि को फेंकता है।

describe('userApp', function(){ 
    console.log("starting TEST3"); <=== this prints 
    var $log; 
    beforeEach(function() { 
    console.log("TEST3: in beforeEach..."); <=== this prints 
    module('userApp', function($provide, _$log_) { 
     $log = _$log_; 
     console.log("TEST3: in beforeEach/module..."); <=== never executed 
     // Output messages 
     $provide.value('$log', console); 
     $log.info("TEST3: calling $log in beforeEach..."); 
    }) 
    }); 
    it('should be able to log something', function(){ 
    console.log("TEST3: in it..."); 
    $log.info("TEST3: Using $log for logging..."); <=== $log undefined err 
    }); 
}); 

इसके अलावा, यह में कोड लगता है "मॉड्यूल ('userApp' ..." निष्पादित कभी नहीं ...?

उत्तर

5

कारण अपने लॉग संदेश console.log("in beforeEach..."); नहीं दिखाया जाता है, क्योंकि यह नहीं है वास्तव में beforeEach के अंदर, यह एक अज्ञात फ़ंक्शन के अंदर module(..) को एक तर्क के रूप में पास किया गया है जिसे कोणीय-मैक्स द्वारा मॉड्यूल माना जाता है। यह मॉड्यूल केवल तभी निष्पादित किया जाएगा जब इंजेक्शन होता है और साथ ही आपको एक लॉग संदेश प्राप्त होगा in beforeEach..., लेकिन आपके परीक्षण में कोई इंजेक्शन नहीं है, इसलिए ऐसा कभी नहीं होता है। beforeEach वैसे भी आग लगती है, आपने अभीनहीं डाला 10 सही जगह पर; यह काम करेगा:

beforeEach(function() { 

    console.log("in beforeEach..."); 

    module('userApp', function($provide) { 
    // Output messages 
    $provide.value('$log', console); 
    }); 

}); 

भी ऐसा लगता है कि आप आप परीक्षण सुइट में $log मज़ाक उड़ाया सुई भूल गया, अपने $log चर किसी भी मूल्य हो जाता है कभी नहीं, तो यह त्रुटि राज्यों के रूप में अपरिभाषित रहता है। http://plnkr.co/edit/EirNEthh4CXdBSDAeqOE?p=preview

डॉक्स::

+0

धन्यवाद, माइकल ... कि मदद करने के लिए शुरू होता है

describe('userApp', function(){ var $log; beforeEach(function() { console.log("in beforeEach..."); module('userApp', function($provide) { // Output messages $provide.value('$log', console); }); // getting an instance of mocked service to use in a test suite inject(function (_$log_) { $log = _$log_; }); }); it('should be able to log something', function(){ console.log("in it..."); $log.info("Using $log for logging..."); }); }); 

plunker देखें। मैं इस पोस्ट को एक और नमूने के साथ अपडेट करने जा रहा हूं जो ऐसा लगता है जैसे इसे काम करना चाहिए। यह इस तरह लग रहा है - भले ही पहले एच() सभी को निष्पादित किया गया हो, फिर भी उनके अंदर मॉड्यूल() कोड एक ही समय में निष्पादित नहीं होता है? – JESii

+0

अपने अपडेट में आप 'मॉड्यूल()' का उपयोग करके '_ $ log_' इंजेक्ट करने का प्रयास करते हैं, लेकिन यह काम नहीं करेगा। 'मॉड्यूल() 'केवल मॉड्यूल पंजीकृत करने के लिए है जिसे आप इंजेक्ट()' कहते हैं तो निष्पादित किया जाएगा। इंजेक्शन इंजेक्टर पर काम है। यदि आप प्रत्येक से पहले 'इंजेक्ट()' को यहां कॉल करते हैं, तो इसे "* एक ही समय *" माना जा सकता है। मेरे नमूने में मैंने इसे 'इंजेक्ट' को 'पहले से' पर ले जाया है ताकि यह थोड़ा और स्पष्ट हो सके कि –

+0

धन्यवाद, माइकल; आपने इसे समझाए जाने का अच्छा काम किया है। हालांकि, यह वह जगह है जहां कोणीय पागल हो रहा है, आईएमओ। अगर मैं पहले 'इंजेक्ट' डालता हूं, उसके बाद 'मॉड्यूल' कथन के बाद, मुझे "इंजेक्टर पहले ही बनाया गया है, मॉड्यूल पंजीकृत नहीं कर सकता!"। एसओ पर http: // stackoverflow पर इसके बारे में पहले से ही एक चर्चा है।कॉम/प्रश्न/24 9 00067/इंजेक्टर-पहले से निर्मित-कर-रजिस्टर-ए-मॉड्यूल कई अलग-अलग दृष्टिकोणों के साथ ... @gilamarn द्वारा उत्तर पर तर्क को नोट करें। ऐसा लगता है कि कोणीय में परीक्षण बहुत दृढ़ता से है। – JESii

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

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