2014-11-05 13 views
8

मैं एक ऐसी सेवा का परीक्षण करने की कोशिश कर रहा हूं जो मैं बनाता हूं जो एंगुलर के $q वादा के कार्यान्वयन का उपयोग करता है। मैं कर्म, मोचा, चाई, सीनॉन, सिनन चाई और चाई के वादे के संयोजन के रूप में उपयोग कर रहा हूं।

मेरे द्वारा लिखे गए सभी परीक्षण और वादे वापस लौट रहे हैं, लेकिन वे $q.all([ ... ]) को अस्वीकार या उपयोग करते हैं। मैंने कोशिश की है कि मैं सोच सकता हूं लेकिन मुझे लगता है कि समस्या कहां है।

निम्नलिखित मैं क्या कर रहा हूँ परीक्षण की एक पतली संस्करण है:

"use strict"; 


describe("Promise", function() { 

    var $rootScope, 
     $scope, 
     $q; 

    beforeEach(angular.mock.inject(function (_$rootScope_, _$q_) { 
     $rootScope = _$rootScope_; 
     $q = _$q_; 
     $scope = $rootScope.$new(); 
    })); 

    afterEach(function() { 
     $scope.$apply(); 
    }); 

    it("should resolve promise and eventually return", function() { 

     var defer = $q.defer(); 

     defer.resolve("incredible, this doesn't work at all"); 

     return defer.promise.should.eventually.deep.equal("incredible, this doesn't work at all"); 
    }); 

    it("should resolve promises as expected", function() { 

     var fst = $q.defer(), 
      snd = $q.defer(); 

     fst 
      .promise 
      .then(function (value) { 
       value.should.eql("phew, this works"); 
      }); 

     snd 
      .promise 
      .then(function (value) { 
       value.should.eql("wow, this works as well"); 
      }); 

     fst.resolve("phew, this works"); 
     snd.resolve("wow, this works as well"); 

     var all = $q.all([ 
      fst.promise, 
      snd.promise 
     ]); 

     return all.should.be.fullfiled; 
    }); 

    it("should reject promise and eventually return", function() { 
     return $q.reject("no way, this doesn't work either?").should.eventually.deep.equal("no way, this doesn't work either?"); 
    }); 

    it("should reject promises as expected", function() { 

     var promise = $q.reject("sadly I failed for some stupid reason"); 

     promise 
      ["catch"](function (reason) { 
       reason.should.eql("sadly I failed for some stupid reason"); 
      }); 

     var all = $q.all([ 
      promise 
     ]); 

     return all.should.be.rejected; 
    }); 

}); 

3, पिछले और पहले टेस्ट जो कि असफल रहे हैं। असल में यह असफल नहीं होता है, यह टाइमआउट पार होने के बाद बस हल हो जाता है और मुझे Error: timeout of 2000ms exceeded मिलता है।

EDIT: मैंने अभी तक Kris Kowal के वादे के कार्यान्वयन के साथ परीक्षण करने का प्रयास किया है और यह इसके साथ ठीक काम करता है।

पीएसमुझे वास्तव में पता चला कि मोचा, चाई या चाई के कटोरे में कहीं भी कुछ समय बिताया गया है और afterEach हुक को टाइमआउट से बाद में बुलाया जाता है।

+0

यदि मैं छद्म कोड को समझ रहा हूं, ऐसा लगता है कि आप अपेक्षाओं को लिखने के बाद '$ scope। $ लागू() 'नहीं कह रहे हैं।क्या आप वचन को हल/अस्वीकार करने के बाद इसे कॉल करने का प्रयास कर सकते हैं? –

+0

मैंने वास्तव में भी कोशिश की है, मैं इन परीक्षणों के साथ जल्द ही एक पहेली बन जाएगा और चल रहा हूं। – Roland

+0

'$ scope चला रहा है। '' बाद में 'में' लागू 'हो सकता है यदि आप' बाद में 'चलने से पहले वादे के मूल्य की अपेक्षा करते हैं तो –

उत्तर

3

मैंने यह पता लगाने की कोशिश की है कि परीक्षाएं क्यों न हो रही हैं, भले ही पहले नज़र में उन्हें क्यों न हो। बेशक मुझे afterEach से स्थानांतरित करना होगा क्योंकि यह @proloser के रूप में कॉल करने की जगह नहीं है।

भले ही मैंने ऐसा किया है, परीक्षण अभी भी पास नहीं हो रहे हैं। मैंने chai-as-promised और angular पर भी कोई समस्या/प्रतिक्रिया प्राप्त करने के लिए मुद्दों को खोला है और मुझे वास्तव में बताया गया है कि यह काम करने की संभावना नहीं है। कारण शायद पाचन चरण पर कोणीय $q की निर्भरता के कारण है जो चाई-ए-प्रोमस्ड लाइब्रेरी में नहीं है।

इसलिए मैंने $q के बजाय Q के साथ परीक्षणों की जांच की है और यह ठीक काम करता है, इस प्रकार मेरी परिकल्पना को मजबूत करता है कि गलती चई-जैसा-वादा पुस्तकालय में नहीं थी।

मैं अंत में गिरा दिया गया है चाय के रूप में देने का वादा किया है और मैं बजाय मोचा के done कॉलबैक का उपयोग कर अपने परीक्षण फिर से लिख दिया (भले ही पर्दे के पीछे, चाय के रूप में देने का वादा किया ही नहीं है):

"use strict"; 


describe("Promise", function() { 

    var $rootScope, 
     $scope, 
     $q; 

    beforeEach(angular.mock.inject(function (_$rootScope_, _$q_) { 
     $rootScope = _$rootScope_; 
     $q = _$q_; 
     $scope = $rootScope.$new(); 
    })); 

    it("should resolve promise and eventually return", function (done) { 

     var defer = $q.defer(); 

     defer 
      .promise 
      .then(function (value) { 
       value.should.eql("incredible, this doesn't work at all"); 
       done(); 
      }); 

     defer.resolve("incredible, this doesn't work at all"); 

     $scope.$apply(); 

    }); 

    it("should resolve promises as expected", function (done) { 

     var fst = $q.defer(), 
      snd = $q.defer(); 

     fst 
      .promise 
      .then(function (value) { 
       value.should.eql("phew, this works"); 
      }); 

     snd 
      .promise 
      .then(function (value) { 
       value.should.eql("wow, this works as well"); 
      }); 

     fst.resolve("phew, this works"); 
     snd.resolve("wow, this works as well"); 

     var all = $q.all([ 
      fst.promise, 
      snd.promise 
     ]); 

     all 
      .then(function() { 
       done(); 
      }); 

     $scope.$apply(); 

    }); 

    it("should reject promise and eventually return", function (done) { 

     $q 
      .reject("no way, this doesn't work either?") 
      .catch(function (value) { 
       value.should.eql("no way, this doesn't work either?"); 
       done(); 
      }); 

     $scope.$apply(); 

    }); 

    it("should reject promises as expected", function (done) { 

     var promise = $q.reject("sadly I failed for some stupid reason"); 

     promise 
      ["catch"](function (reason) { 
       reason.should.eql("sadly I failed for some stupid reason"); 
      }); 

     var all = $q.all([ 
      promise 
     ]); 

     all 
      .catch(function() { 
       done(); 
      }); 

     $scope.$apply(); 

    }); 

}); 

उपर्युक्त परीक्षण सभी उम्मीद के अनुसार पास होंगे। ऐसा करने के अन्य तरीके हो सकते हैं, लेकिन मैं यह नहीं समझ पाया कि और कैसे, इसलिए यदि कोई और करता है, तो यह पोस्ट करना बहुत अच्छा होगा ताकि अन्य इससे लाभ उठा सकें।

+0

धन्यवाद आदमी आपने मुझे घंटे बचाया – Blacksonic

+0

@blacksonic - कोई समस्या नहीं, जब तक मुझे कोई फिक्स नहीं मिला तब तक मैंने खुद को दिन बिताया :) – Roland

13

afterEach() सफाई के लिए उपयोग किया जाता है, न कि आपकी तैयारी के बाद कोड निष्पादित करने के लिए, बल्कि आपके परीक्षण से पहले। $scope.$apply() या तो सफाई नहीं है।

आप निम्न कार्य करने की आवश्यकता है:

// setup async behavior 
var all = $q.all(x.promise, y.promise) 

// resolve your deferreds/promises 
x.reject(); y.reject(); 

// call $scope.$apply() to 'digest' all the promises 
$scope.$apply(); 

// test the results 
return all.should.be.rejected; 

आप एक $apply() कर रहे हैं के बाद अपने परीक्षण सेटअप और मूल्यांकन के बीच में नहीं, किया जाता है।

+0

यदि आप चाहें तो आप इसे [plnk] (http://plnkr.co/edit/IusDwx7ERoiqiUYKwqKn?p=preview) पर परीक्षण करने का प्रयास कर सकते हैं, जिसे मुझे इसे स्थापित करने में कठिन समय है। मुझे लगता है कि मेरे संसाधनों में से एक अमान्य या कुछ है, क्योंकि मुझे कंसोल में एक त्रुटि मिलती है जो बताती है कि मुझे 'पहले से पहले' गायब है। मैंने कभी भी ब्राउज़र में परीक्षण करने की कोशिश नहीं की है, इसलिए कुछ इसे काम करने में मदद करते हैं, इसलिए सराहना की जाएगी ताकि हम देख सकें कि यह उत्तर वास्तव में काम करता है और हमारे पास ऑनलाइन संदर्भ भी होगा ताकि अन्य उपयोगकर्ता इसे देख सकें। – Roland

+0

मैंने टिप्पणी में लिखा है कि कुछ मदद की ब्राउज़र में इसे स्थापित करने की सराहना की जाएगी क्योंकि मैंने कभी ऐसा नहीं किया था। और आप बस एक plnkr बना सकते हैं और अपना फिक्स लागू कर सकते हैं और दिखा सकते हैं कि यह वास्तव में काम करता है, अगर आप निश्चित रूप से करना चाहते हैं। इसे मेरी मशीन पर स्थानीय रूप से करना और यह कहकर कि यह काम करता है, यह अन्य उपयोगकर्ताओं की मदद नहीं करेगा जो एक ही मुद्दे पर ठोकर खाएंगे। – Roland

+0

आपका सुझाव काम नहीं करता है, और मैंने पहले ही सुझाव दिया है कि आपने पहले क्या सुझाव दिया था। यही कारण है कि मैंने पूछा कि क्या आप ब्राउज़र में परीक्षण स्थापित करने में मदद कर सकते हैं ताकि आप इसे और अन्य उपयोगकर्ताओं को भी देख सकें यदि यह काम करता। – Roland

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