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

Sur*_*ati 6 mocha.js node.js async-await

我正在练习基本的单元测试用例,mocha并且有点困惑如何使用WHOWHEN来使用done()处理程序。

  1. 如何使用done()

以下是我无法使用的示例代码done

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);
  }
})
Run Code Online (Sandbox Code Playgroud)

当我运行时,它失败并引发错误-

错误:超时超过2000毫秒。对于异步测试和挂钩,请确保调用了“ done()”;如果返回承诺,请确保其解决。

但是done应该仅在失败的情况下被调用(原谅我,如果我说的是不正确的话,我是初学者),这是我做的catch阻塞,并且是返回到Promise的第二点,效果很好。见下面的代码

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);
    }
  })
});
Run Code Online (Sandbox Code Playgroud)

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

  1. 什么时候done应该使用?

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

Est*_*ask 8

正确的方法是不要使用donewith async..await。Mocha 支持 promises 并且能够链接一个从it等函数返回的 promise 。而async功能是,它总是返回一个承诺函数语法糖:

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);
})
Run Code Online (Sandbox Code Playgroud)

done仅在测试异步 API 时才需要,而不涉及承诺。即便如此,转换为 promise 通常会导致更清晰的控制流。

和这个

it('Testing insertDocumentWithIndex', async () => {
  return new Promise(async (resolve, reject) => {
  ...
Run Code Online (Sandbox Code Playgroud)

是promise构造反模式,由于asyncpromise构造函数回调,情况更糟。

这些问题也适用于其他具有类似 API 的 JS 测试框架,Jest 和 Jasmine。