How to test async code with mocha using await
How do I test async code with mocha? I wanna use multiple await
inside mocha
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();
});
});
This produces error below:
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)
If I remove done() I get:
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)
You can return the Promise:
Mocha supports Promises out-of-the-box; You just have to return
the Promise to it()
's callback. If that Promise resolves then the test passes otherwise it fails.
Since async
functions always implicitly return a Promise
you can just do:
async function getFoo() {
return 'foo'
}
describe('#getFoo', () => {
it('resolves with foo', () => {
return getFoo().then(result => {
assert.equal(result, 'foo')
})
})
})
You don't need done
nor async
for your it
.
If you still insist on using async/await
:
async function getFoo() {
return 'foo'
}
describe('#getFoo', () => {
it('returns foo', async () => {
const result = await getFoo()
assert.equal(result, 'foo')
})
})
In either case, do not declare done
as an argument
If you use any of the methods described above you need to remove done
completely from your code. Passing done
as an argument to it()
hints to Mocha that you intent to eventually call it.
Using both Promises and done
will result in:
Error: Resolution method is overspecified. Specify a callback or return a Promise; not both
The done
method is only used for testing callback-based or event-based code.