在通过Mocha测试asc / await时正确使用done()的方法

时间:2018-09-21 18:19:28

标签: node.js async-await mocha

我正在使用void*练习基本的单元测试用例,并且对使用done()处理程序的 HOW When 有点困惑。

  1. 如何使用mocha

下面是我无法使用done()的示例代码:

done

我跑步时失败,并引发错误-

  

错误:超时超过2000毫秒。对于异步测试和挂钩,请确保   称为“ done()”;如果返回了Promise,请确保它可以解决。

但是只有在失败的情况下才应调用it('Testing insertDocumentWithIndex', async (done) => { try{ var data = await db.insertDocumentWithIndex('inspections', { "inspectorId" : 1, "curStatus" : 1, "lastUpdatedTS" : 1535222623216, "entryTS" : 1535222623216, "venueTypeId" : 1, "location" : [ 45.5891279, -45.0446183 ] }) expect(data.result.n).to.equal(1); expect(data.result.ok).to.equal(1); } catch(e){ logger.error(e); done(e); } }) (请原谅我,如果我说的是不正确的话,我是初学者),我在done块中做了第二点承诺的回报,效果很好。参见下面的代码

catch

但这需要附加的Promise构造代码,但这不是问题。但这提出了另一个问题

  1. 何时应使用it('Testing insertDocumentWithIndex', async () => { return new Promise(async (resolve, reject) => { try{ var data = await db.insertDocumentWithIndex('inspections', { "inspectorId" : 1, "curStatus" : 1, "lastUpdatedTS" : 1535222623216, "entryTS" : 1535222623216, "venueTypeId" : 1, "location" : [ 45.5891279, -45.0446183 ] }) expect(data.result.n).to.equal(1); expect(data.result.ok).to.equal(1); resolve() } catch(e){ reject(e); } }) });

使用done编写测试用例的更好方法的任何帮助或建议都会有所帮助。

1 个答案:

答案 0 :(得分:2)

正确的方法是不要将doneasync..await一起使用。 Mocha支持诺言,并能够链接从it等函数返回的诺言。 async函数是始终返回promise的函数的语法糖:

it('Testing insertDocumentWithIndex', async () => {
    var data = await db.insertDocumentWithIndex('inspections', {
      "inspectorId" : 1,
      "curStatus" : 1,
      "lastUpdatedTS" : 1535222623216,
      "entryTS" : 1535222623216,
      "venueTypeId" : 1,
      "location" : [
        45.5891279,
        -45.0446183
      ]
    })
    expect(data.result.n).to.equal(1);
    expect(data.result.ok).to.equal(1);
})

done仅用于测试异步API,而不涉及承诺。即便如此,兑现承诺通常也会带来更清晰的控制流程。

还有这个

it('Testing insertDocumentWithIndex', async () => {
  return new Promise(async (resolve, reject) => {
  ...

是promise构造的反模式,由于async promise构造函数的回调,更糟。