2015-02-09 6 views
7

मैं किए गए() फ़ंक्शन के साथ एक सरल वादे कार्यान्वयन (एसिंक्रोनस कोड) पर एक जैस्मीन परीक्षण को लागू करने की कोशिश कर रहा हूं और मेरा परीक्षण विफल रहता है हालांकि कोड का परीक्षण किया जा रहा है पूरी तरह से ठीक। क्या कोई मेरी मदद कर सकता है कि मेरी परीक्षा में क्या गुम है?जैस्मीन 2.0.0 में किए गए एसिंक्रोनस कार्यक्षमता के साथ परीक्षण()

var Test = (function() { 
    function Test(fn) { 
     this.tool = null; 
     fn(this.resolve.bind(this)); 
    } 
    Test.prototype.then = function (cb) { 
     this.callback = cb; 
    }; 
    Test.prototype.resolve = function (value) { 
     var me = this; 
     setTimeout(function() { 
      me.callback(value); 
     }, 5000); 
    }; 
    return Test; 
})(); 

describe("setTimeout", function() { 

    var test, newValue = false, 
     originalTimeout; 
    beforeEach(function (done) { 
     originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; 
     jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; 

     test = new Test(function (cb) { 
      setTimeout(function() { 
       cb(); 
      }, 5000); 
     }); 
     test.then(function() { 
      newValue = true; 
      console.log(1, newValue); 
      done(); 
     }); 
    }); 

    it("Should be true", function (done) { 
     expect(1).toBe(1); 

     expect(newValue).toBeTruthy(); 
    }); 

    afterEach(function() { 
     jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; 
    }); 
}); 

jsfiddle में एक ही परीक्षण: http://jsfiddle.net/ravitb/zsachqpg/

उत्तर

7

इस कोड को वस्तु की तरह एक साधारण वादा परीक्षण कर रहा है, इसलिए Test वस्तु सुविधा के लिए एक वादा कॉल करेंगे। 1. beforeEach() समारोह में cb() कार्यप्रणाली को कॉल करके .then() विधि 2. वादे को हल करने के लिए कॉल:

वादा निर्माण के बाद दो अलग async ईवेंट नहीं है।

वास्तविक दुनिया में इन दोनों को किसी भी क्रम में और किसी भी समय बुलाया जा सकता है।

परीक्षण के लिए, .then() कॉल it() अनुभाग के कॉलबैक में ले जाया जा सकता है और सब कल्पना तरीकों (उदाहरण, expect()) यह कॉलबैक है या वे पहले इसका समाधान नहीं चलाएँगे में कहा जाता है की जरूरत है। beforeEach() परीक्षण सेटअप का हिस्सा है जबकि it() फ़ंक्शन spec, परीक्षण स्वयं है।

done() विधि दो बार कॉल किया जाना चाहिए,

  1. जब beforeEach() async कार्रवाई समाप्त हो गया है (यानी के बाद cb() कहा जाता है), कल्पना प्रदर्शन शुरू हो जाएगा कि। तो यह कुछ इस तरह दिखना चाहिए:

    beforeEach(function (done) { 
        test = new Test(function (cb) { 
         setTimeout(function() { 
          console.log("in beforeEach() | setTimeout()"); 
          cb(resolvedValue); 
          done() 
         }, 500); 
        }); 
        }); 
    
  2. जब कल्पना की (it() अनुभाग के) async कार्रवाई चमेली परीक्षण तरीकों के लिए सभी कॉल के बाद .then() विधि के अंदर समाप्त हो गया है, इस जैस्मीन बता देंगे कल्पना का चलना समाप्त (और तो समय-समय पर नहीं पहुंचाया जाएगा)। तो:

    it("Should be " + resolvedValue, function (done) { 
        test.then(function (value) { 
         console.log("in then()"); 
         expect(value).toBe(resolvedValue); 
         done(); 
        });  
    }); 
    

इसके अलावा, आप परीक्षण है कि एक वेरिएबल का मान मैं परीक्षण कर रहा हूँ कि .then() विधि को भेजे गए मान एक वादा संकल्प को पारित कर दिया के रूप में ही है बदल गया है के बजाय देख सकते हैं cb() फ़ंक्शन जैसा कि आप सही व्यवहार कर रहे हैं।

यहां आपके पहेली का updated version है।

आप ब्राउज़र के कंसोल में जाँच को देखने के लिए कि सभी कॉलबैक कहा जा रहा है

नोट कर सकते हैं: चमेली के DEFAULT_TIMEOUT_INTERVAL बदलने बस इसे और अधिक बिना किसी कारण के जटिल बना देता है, तो मैं यह और कुछ बाहरी कोड हटा दिया।

+1

इसके अलावा, यदि आपको * प्रति-परीक्षण आधार पर टाइमआउट अंतराल को बदलने की आवश्यकता है, तो आप कस्टम अंतराल को तीसरे पैरामीटर के रूप में 'it() '(यानी आपके कार्य के बाद:' (desc , फ़ंक्शन (किया गया) {...}, 10000); '।) – Kev

+0

@Lior कृपया इसकी सहायता करें: https://stackoverflow.com/questions/45311260/how-to-test-an-asynchronous-function-using- कर्म-चमेली-इन-ionic2 – Aditya

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