Hàm async trong mocha before () vẫn hoàn thành trước nó () spec?


89

Tôi có một chức năng gọi lại before()để làm sạch cơ sở dữ liệu. Mọi thứ có before()được đảm bảo hoàn thành trước khi it()bắt đầu không?

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
Điều này sẽ hoạt động. Bạn chỉ cần đảm bảo rằng bạn trả lại một lời hứa từ người beforexử lý của bạn . Ví dụbefore(function () { return db.collection...}
broofa

Câu trả lời:


126

Đối với các phiên bản mocha mới:

Bây giờ bạn có thể trả lại lời hứa cho mocha và mocha sẽ đợi nó hoàn thành trước khi tiếp tục. Ví dụ, bài kiểm tra sau sẽ vượt qua:

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

Bạn có thể tìm tài liệu tại đây

Đối với các phiên bản mocha cũ hơn:

Nếu bạn muốn yêu cầu không đồng bộ của mình được hoàn thành trước khi mọi thứ khác xảy ra, bạn cần sử dụng donetham số trong yêu cầu trước của mình và gọi nó trong lệnh gọi lại.

Sau đó Mocha sẽ đợi cho đến khi doneđược gọi để bắt đầu xử lý các khối sau.

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

Tuy nhiên, bạn nên cẩn thận, vì không khai thác cơ sở dữ liệu để kiểm tra đơn vị có thể làm chậm quá trình thực thi, vì các yêu cầu trong cơ sở dữ liệu có thể khá lâu so với thực thi mã đơn giản.

Để biết thêm thông tin, hãy xem tài liệu Mocha .


Lưu ý rằng nếu thao tác không đồng bộ diễn ra quá lâu, bạn sẽ nhận được thông báo lỗi không hữu ích lắm: stackoverflow.com/a/48087201/1827734
BrDaHa

Mocha hiện hỗ trợ các hứa hẹn trong hooks - mochajs.org/#working-with-promises . Không cần sử dụng done. Chỉ cần trả lại một lời hứa.
broofa

Bạn cũng có thể: before(function () { return db.collection('user').remove({}); })kể từ khi remove()trở lại một lời hứa, không cần phải bọc nó trong mộtnew Promise()
Brent Greeff

7

Hy vọng rằng db.collection () của bạn sẽ trả về một lời hứa. Nếu có thì bạn cũng có thể sử dụng từ khóa async trong 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
Làm thế nào về after()? Của tôi awaithoạt động tốt khi tôi gọi nó vào before()(nó xóa một mục nhập DB), nhưng nếu tôi đặt điều tương tự vào after(), nó không xóa bất cứ thứ gì vào thời điểm một giây describe()...it()bắt đầu và không thành công do dữ liệu không bị xóa.
Juha Untinen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.