2014-11-06 5 views
6

के बजाय ज़ोर (गलत) के लिए मैं एक मोचा परीक्षण के इस प्रकार है:मोचा जोर रुक जाता है/समय समाप्ति त्रुटि

describe 'sabah', → 
    beforeEach → 
     @sabahStrategy = _.filter(@strats, { name: 'sabah2' })[0] 
      .strat 

    it 'article list should be populated', (done) → 
     @timeout 10000 
     strat = new @sabahStrategy() 
     articles = strat.getArticleStream('barlas') 
     articles.take(2).toArray((result)→ 
      _.each(result, (articleList) → 

       // I make the assertions here 
       // assert(false) 
       assert(articleList.length > 1) 
      ) 
      done() 
     ) 

समस्या है, जब भी मैं assert(false) करते हैं, परीक्षण टाइमआउट तक लटकी हुई है, एक दावा त्रुटि देने के बजाय, क्यों?

संपादित करें:

उदाहरण के लिए अगर मैं

it 'assert false', (done) → 
     assert(false) 
     done() 

    it 'article link stream should be populated', (done) → 
     @timeout 20000 
     articles = @sabahStrategy.articleLinkStream('barlas') 
     articles.pull((err, result)→ 
      console.log('here') 
      assert(false) 
      console.log('after') 
      assert(!err) 
      assert(result.length > 1); 
      _.each(result, (articleList) → 
       assert(articleList.link) 
      ) 
      done() 
     ) 

पहले एक इन दो परीक्षण है, अभिकथन त्रुटि अपेक्षित के रूप में, दूसरा एक, लॉग here देता है, और इसलिए assert(false) पर लटका after कभी नहीं लॉग इन किया गया है। इसमें articles एक स्ट्रीम होने के साथ कुछ करना है और दावा pull कॉलबैक के भीतर है, यह highland.js API से है।

हल संपादित:

मैं इस समस्या का एक सरलीकृत संस्करण का उत्पादन किया गया है:

it 'article stream should be populated', (done) → 
     @timeout 30000 
     articles = @sabahStrategy.articleStream('barlas') 

     articles.pull((err, result) → 
      try 
       # assert false properly throws now. 
       assert(false) 
       assert(!err) 
       assert(result.length == 1) 
       assert(result[0].body) 
       assert(result[0].title || result[0].title2) 
       done() 
      catch e 
       done(e) 
     ) 

EDIT2:

तो पॉल के अनुसार मैं इस कोड के साथ समस्या तय :

h = require('highland') 
Q = require('q') 

describe 'testasynchigh', → 
    beforeEach → 
     @deferred = Q.defer() 
     setTimeout((→ 
      @deferred.resolve(1) 
     ).bind(this), 50) 


    it 'should throw', (done) → 
     s = h(@deferred.promise); 
     s.pull((err, result) → 
      console.log result 
      assert false 
      done() 
     ) 

मुझे लगता है कि आपका संस्करण वास्तव में @ लुइस काम करता है, लेकिन यदि आप मिश्रण में वादे शामिल करते हैं, तो मोचा समस्या को संभाल नहीं सकता है, इसलिए यह इस उदाहरण में लटका होगा। assert false पर टिप्पणी करने का प्रयास करें और इसे पास करें।

तो लुई मुझे आशा है कि मुझे आपका ध्यान मिल जाएगा, क्या आप समस्या की व्याख्या कर सकते हैं, और try catch वास्तव में बदसूरत लग रहा है और मुझे उम्मीद है कि आपको इसका उचित समाधान मिल जाएगा।

उत्तर

7

क्योंकि आप यही कह रहे हैं कि आप ऐसा करना चाहते हैं, जब आप 'किया' कॉलबैक जोड़ते हैं।

वास्तव में यह परीक्षण करने का तरीका return done(err) पर कॉल करना है अगर दावा विफल हो जाएगा, जहां त्रुटि किसी भी स्ट्रिंग या त्रुटि ऑब्जेक्ट की रिपोर्ट है जिसे आप चाहते हैं।

सबसे पहले, जब आपका दावा विफल हो जाता है, तो प्रोग्राम अपवाद फेंकता है और done() तक कभी नहीं पहुंचता है, यही कारण है कि आप इसे नहीं देख रहे हैं। इस तरह assstions काम करने के लिए माना जाता है, हालांकि जब से आप एक async परीक्षण में हैं, नतीजा यह है कि कॉलबैक कभी नहीं आग लगती है, यही कारण है कि आप टाइमआउट मारा।

दूसरा, जैसा कि मेरे मूल उत्तर में कहा गया है err कोई त्रुटि है जिसे आप परीक्षण से बाहर भेजना चाहते हैं। यह एक स्ट्रिंग त्रुटि संदेश या पूर्ण-ऑन त्रुटि ऑब्जेक्ट उपclass हो सकता है। परीक्षण को इंगित करने के लिए आप इसे बनाते हैं और फिर done() पर भेज देते हैं।

एसिंक्रोनस परीक्षण में अपने कोड को व्यवस्थित करने का बेहतर तरीका यह है कि आपके परीक्षणों को दावे के बजाए सरल बूलियन के रूप में उपयोग करना है। यदि आप वास्तव में जोर से उपयोग करना चाहते हैं, तो इसे try..catch में लपेटें।,

if(err) return done(err); // in this case, err is defined as part of the parent callback signature that you have in your code already. 

if(result.length < 1) return done('Result was empty!'); 

अंत में यदि आप वास्तव में assert चाहते हैं, तो आप कर सकते हैं: यहां कुछ उदाहरण है

try{ 
    assert(!err); 
}catch(e){ 
    return done(e); 
} 

मैं return done(err) बजाय done(err) फोन कर रहा हूँ, क्योंकि यह क्रियान्वित करने से कोड के बाकी बंद हो जाता है , जो सामान्य रूप से आप चाहते हैं।

+1

मैं भी दो साल के लिए मोचा कोड लिखा है, और * * आम तौर पर आपको अपने उत्तर में अपवादों को पकड़ने की आवश्यकता नहीं होती है। ** यह बहुत अच्छी तरह से हो सकता है कि 'highland.js' अपवाद निगल रहा है या इसके बारे में कुछ विशिष्टता है कि यह कॉलबैक में अपवादों को कैसे प्रबंधित करता है। लेकिन आम तौर पर, मोचा अपवादों का पता लगाने में काफी सक्षम है, चाहे वे तुल्यकालिक या असीमित हों। बस इसे चलाएं ("परीक्षण", फ़ंक्शन (किया गया) {setTimeout (फ़ंक्शन() {नई त्रुटि फेंक दें();}, 100);}); '' 'किया गया 'नहीं कहा जाता है और यह कोई गलती नहीं है।)' मोचा किसी भी मुद्दे के बिना अपवाद का पता लगाएगा। – Louis

+0

@ लुइस, आप यहां वर्णित की तरह निगलने का मतलब है https://github.com/caolan/highland/issues/121, क्या आपको लगता है कि यह समस्या हो सकती है? – user3995789

+0

@ user3995789 हाँ, मुझे लगता है कि यह मुद्दा है। मैंने आरएसवीपी (एक और वादा लाइब्रेरी) के साथ अपने नवीनतम स्निपेट की कोशिश की है और क्यू के साथ वही परिणाम प्राप्त कर लिया है। मैंने हाईलैंड के 'एरर्स (' कॉल का उपयोग करने का भी प्रयास किया है, लेकिन मुझे इससे कुछ भी नहीं मिला है। – Louis

0

जब मैं एक सुपर साधारण परीक्षण के साथ Highland.js उपयोग करते हैं, मोचा पकड़ता नाकाम रहने के बिना किसी समस्या के जोर:

var _ = require("highland"); 
var fs = require("fs"); 
var assert = require("assert"); 

describe("test", function() { 
    it("test", function (done) { 
     var s = _([1, 2, 3, 4]); 
     s.pull(function (err, result) { 
      console.log(result); 
      assert(false); 
      done(); 
     }); 
    }); 
}); 

यह पता चलता है कि आपके उदाहरण में समस्या मोचा, और न ही Highland.js नहीं है। यदि articleLinkStream ऑब्जेक्ट (या articleSream; यह स्निपेट से स्निपेट में बदलता प्रतीत होता है) तो कस्टम कोड है तो शायद वह कोड छोटी है और वास्तव में उन्हें स्टैक को स्थानांतरित करने के बजाय अपवादों को निगलता है।

+0

हटाएं ** कृपया देखें ** ** कृपया। – user3995789

0

एक ही मुद्दे के साथ किसी को भी के लिए: आप यकीन है कि done() कहा जाता है कि हो जाता है के बाद भी एक ज़ोर विफल रहता है निम्नलिखित कोड में की तरह, बनाना चाहिए:

try { 
    // your asserts go here 
    done(); 
} catch (e) { 
    done(e); 
} 
संबंधित मुद्दे