मोचा में Async फ़ंक्शन इससे पहले () कल्पना से पहले समाप्त हो गया है?


89

मेरे पास एक कॉलबैक फ़ंक्शन है before()जिसमें सफाई डेटाबेस के लिए है। शुरू before()होने से पहले खत्म करने की गारंटी में सब कुछ है it()?

before(function(){
   db.collection('user').remove({}, function(res){}); // is it guaranteed to finish before it()? 
});

it('test spec', function(done){
  // do the test
});

after(function(){
});

1
यह काम करना चाहिए। आपको बस यह सुनिश्चित करने की आवश्यकता है कि आप अपने beforeहैंडलर से एक वादा वापस कर दें । जैसेbefore(function () { return db.collection...}
ब्रूफा

जवाबों:


126

नए मोचा संस्करणों के लिए:

अब आप मोचा को एक वादा वापस कर सकते हैं, और मोचा आगे बढ़ने से पहले इसके पूरा होने की प्रतीक्षा करेगा। उदाहरण के लिए, निम्नलिखित परीक्षा पास होगी:

let a = 0;
before(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      a = 1;
      resolve();
    }, 200);
  });
});
it('a should be set to 1', () => {
  assert(a === 1);
});

आप यहाँ दस्तावेज़ पा सकते हैं

पुराने मोचा संस्करणों के लिए:

यदि आप चाहते हैं कि आपका एसिंक्रोनस अनुरोध सब कुछ होने से पहले पूरा हो जाए, तो आपको doneअपने अनुरोध से पहले पैरामीटर का उपयोग करना होगा, और कॉलबैक में कॉल करना होगा।

मोचा तब तक प्रतीक्षा करेगा जब तक doneकि निम्नलिखित ब्लॉकों का प्रसंस्करण शुरू करने के लिए नहीं कहा जाता है।

before(function (done) {
   db.collection('user').remove({}, function (res) { done(); }); // It is now guaranteed to finish before 'it' starts.
})

it('test spec', function (done) {
  // execute test
});

after(function() {});

यद्यपि आपको सावधान रहना चाहिए, क्योंकि यूनिट टेस्टिंग के लिए डेटाबेस को स्टबलिंग करना दृढ़ता से निष्पादन को धीमा नहीं कर सकता है, क्योंकि डेटाबेस में अनुरोध सरल कोड निष्पादन की तुलना में बहुत लंबा हो सकता है।

अधिक जानकारी के लिए, मोचा प्रलेखन देखें ।


ध्यान दें कि यदि अतुल्यकालिक ऑपरेशन में बहुत लंबा समय लगता है, तो आपको एक विफलता संदेश मिलेगा जो बहुत उपयोगी नहीं है: stackoverflow.com/a/48087201/1827734
BrDaHa

मोचा अब हुक में वादों का समर्थन करता है - mochajs.org/#working-with-promises । उपयोग करने की आवश्यकता नहीं है done। बस एक वादा वापस करो।
ब्रूफा

आप यह भी कर सकते हैं: before(function () { return db.collection('user').remove({}); })चूँकि remove()कोई वादा वापस करता है, उसे इसे लपेटने की आवश्यकता नहीं हैnew Promise()
ब्रेंट ग्रीफ

7

उम्मीद है कि आपका db.collection () एक वादा वापस करना चाहिए। यदि हाँ तो आप पहले भी async कीवर्ड का उपयोग कर सकते हैं ()

// Note: I am using Mocha 5.2.0.
before(async function(){
   await db.collection('user').remove({}, function(res){}); // it is now guaranteed to finish before it()
});

4
कैसे के लिए after()? मेरे awaitकाम करता है ठीक है जब मैं में इसे कहते before()हैं (यह एक डीबी प्रविष्टि हटा देता है), लेकिन अगर मैं में सटीक एक ही बात कर दिया after()है, यह समय एक दूसरे से नहीं हटाने के लिए कुछ भी describe()...it()शुरू होता है और विफल रहता है डेटा की वजह से नहीं हटाया जा रहा।
जूहा अन्टिनेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.