mocha before ()의 비동기 함수는 it () 사양 전에 항상 완료됩니까?


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

답변:


126

새로운 모카 버전 :

이제 mocha에 약속을 반환 할 수 있으며, 진행하기 전에 mocha가 완료 될 때까지 기다립니다. 예를 들어 다음 테스트는 통과합니다.

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

여기 에서 설명서를 찾을 수 있습니다.

이전 mocha 버전 :

다른 모든 일이 발생하기 전에 비동기 요청을 완료하려면 donebefore 요청에서 매개 변수 를 사용 하고 콜백에서 호출해야합니다.

Mocha는 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

Mocha는 이제 후크에서 promise를 지원합니다 -mochajs.org/#working-with-promises . 사용할 필요가 없습니다 done. 약속을 돌려주세요.
broofa

당신은 또한 수 before(function () { return db.collection('user').remove({}); })있기 때문에 remove()반환 약속은 필요가 그것을 포장 없습니다new Promise()
브렌트 Greeff

7

바라건대 db.collection ()이 약속을 반환해야합니다. 그렇다면 before ()에서 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()(그것은 DB 항목을 삭제),하지만 난에 정확히 같은 일을 세우면 after(), 그것이 두 번째는 시간에 의해 삭제 아무것도하지 않습니다 describe()...it()때문에 데이터 시작 실패하지 제거된다.
Juha Untinen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.