javascript 如何使用await测试mocha的异步代码

euoag5mw  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(102)

如何用mocha测试async代码?我想在mocha中使用多个await

var assert = require('assert');

async function callAsync1() {
  // async stuff
}

async function callAsync2() {
  return true;
}

describe('test', function () {
  it('should resolve', async (done) => {
      await callAsync1();
      let res = await callAsync2();
      assert.equal(res, true);
      done();
      });
});

这会产生以下错误:

1) test
       should resolve:
     Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.
      at Context.it (test.js:8:4)

如果我删除done(),我得到:

1) test
       should resolve:
     Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/tmp/test/test.js)
yhxst69z

yhxst69z1#

Mocha支持Promises开箱即用;你只需要returnPromiseit()的回调。
如果Promise解析,则测试通过。相反,如果Promise拒绝,则测试失败。就这么简单
现在,由于async函数总是隐式地返回Promise,所以你可以这样做:

async function getFoo() {
  return 'foo'
}

describe('#getFoo', () => {
  it('resolves with foo', () => {
    return getFoo().then(result => {
      assert.equal(result, 'foo')
    })
  })
})

您不需要doneasync来实现it
但是,如果您仍然坚持使用async/await

async function getFoo() {
  return 'foo'
}

describe('#getFoo', () => {
  it('returns foo', async () => {
    const result = await getFoo()
    assert.equal(result, 'foo')
  })
})

无论哪种情况,请勿done声明为函数参数。
如果你使用上面描述的任何方法,你需要从你的代码中完全删除done。将done作为参数传递给it()回调函数,提示Mocha您最终打算调用它。
同时使用Promises * 和 * done将导致:
错误:解析方法被过度指定。指定回调 * 或 * 返回Promise;不是两者都有
done方法仅用于测试基于回调或基于事件的代码。如果你正在测试基于Promise的函数或async/await函数,你不应该使用它。

相关问题