【问题标题】:How to test async code with mocha using await如何使用 await 使用 mocha 测试异步代码
【发布时间】:2018-10-04 07:40:19
【问题描述】:

如何使用 mocha 测试异步代码?我想在 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)

【问题讨论】:

    标签: javascript mocha.js


    【解决方案1】:

    你可以返回 Promise:

    摩卡supports Promises out-of-the-box;你只需要将return 的Promise 传递给it() 的回调。如果该 Promise 解决,则测试通过,否则失败。

    因为async functions always implicitly return a Promise 你可以这样做:

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

    您的it 不需要doneasync

    如果你还坚持使用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 方法仅用于测试基于回调或基于事件的代码。

    【讨论】:

    • 我想调用多个异步代码。这就是为什么我将async 放在函数下。此外,我想在调用它之后做出断言,所以我不能返回一个承诺。我相应地编辑了我的问题
    • 知道了;已编辑。无论哪种方式,当我说您不需要done 时,这意味着您不应该甚至在it 回调中传递它。从您的代码中完全删除 done。传递 done 作为参数向 Mocha 暗示您打算最终调用它。
    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2014-02-06
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多