ฟังก์ชั่น Async ในมอคค่าก่อน () จะเสร็จสิ้นก่อนที่มัน () spec?


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...}
broofa

คำตอบ:


127

สำหรับมอคค่าเวอร์ชันใหม่:

ตอนนี้คุณสามารถคืนสัญญากับมอคค่าได้และมอคค่าจะรอให้มันเสร็จสมบูรณ์ก่อนที่จะดำเนินการต่อ ตัวอย่างเช่นการทดสอบต่อไปนี้จะผ่าน:

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() {});

คุณควรระมัดระวังเนื่องจากการไม่ทำลายฐานข้อมูลสำหรับการทดสอบหน่วยอาจทำให้การดำเนินการช้าลงอย่างมากเนื่องจากคำขอในฐานข้อมูลอาจค่อนข้างยาวเมื่อเทียบกับการเรียกใช้โค้ดแบบธรรมดา

สำหรับข้อมูลเพิ่มเติมโปรดดูที่เอกสาร Mocha


โปรดทราบว่าหากการดำเนินการแบบอะซิงโครนัสใช้เวลานานเกินไปคุณจะได้รับข้อความแจ้งข้อผิดพลาดที่ไม่เป็นประโยชน์: stackoverflow.com/a/48087201/1827734
BrDaHa

มอคค่าในขณะนี้สนับสนุนสัญญาในตะขอ - mochajs.org/#working-with-promises ไม่จำเป็นต้องใช้done. เพียงแค่คืนคำสัญญา
broofa

นอกจากนี้คุณยังสามารถ: before(function () { return db.collection('user').remove({}); })ตั้งแต่remove()คืนคำสัญญาไม่จำเป็นต้องห่อไว้ในnew Promise()
Brent Greeff

7

หวังว่า db.collection () ของคุณควรคืนสัญญา ถ้าใช่คุณสามารถใช้คำหลัก async ใน before ()

// 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()(มันจะลบรายการ DB) แต่ถ้าฉันใส่สิ่งเดียวกันลงไปafter()มันจะไม่ลบอะไรเลยเมื่อวินาทีที่describe()...it()เริ่มต้นและล้มเหลวเนื่องจากข้อมูลไม่ถูกลบออก
Juha Untinen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.