正确调用 mocha done 回调和 promises

Properly call mocha done callback and promises

我的应用程序中有几个集成测试:

 it('creating vehicle', function (done) {
    createVehicle()         
      .then(() => {
        done();
      })
      .catch((err) => {
        done(err);
      });
  });

createVehicle 提出 post 请求并 return 承诺:

 return request.json('post', '/api/vehicle/')
    .send(obj)
    .expect(200)
    .then((res) => {
      expect(res.body).toExist("Body is empty");
      expect(res.body.id).toExist("Id is empty");     
      return res.body;
    });

现在一切正常,但如果我按以下方式重写第一个片段:

it('creating vehicle', function (done) {
        createVehicle()         
          .then(done) //*
          .catch(done); //*
      });

我从摩卡得到错误

done() invoked with non-Error

我明白为什么。 createVehicle return res.body 并传递给 then 回调,结果 done 运行 as done(arg) 我得到了错误,因为 mocha done 回调必须在没有错误时不带参数调用,而在有错误时必须带参数调用。

是否可以使用此变体:

 .then(done) 
 .catch(done); 

如何实现?

当然,我可以删除return语句,但是createVehicle在几个地方使用,我需要returned值:

it('creating vehicle with media', function (done) {
    createVehicle()
       .then(createMedia)  //createMedia will get returned value       
      //....
  });

最简单的解决方案是 return promise 而不是必须处理回调,因为 Mocha supports promises out-of-the-box:

it('creating vehicle', function() {
  return createVehicle();
});