javascript - Paradoksalt problem med mocha done() og async await
Jeg har følgende testtilfelle:
it("should pass the test", async function (done) {
await asyncFunction();
true.should.eq(true);
done();
});
Å kjøre det bekrefter:
Feil: Løsningsmetoden er overspesifisert. Spesifiser en tilbakeringing eller returner en Promise; ikke begge.
Og hvis jeg fjerner done();-setningen, påstår den:
Feil: Tidsavbrudd på 2000 ms overskredet. For asynkrone tester og kroker, sørg for at "done()" blir kalt; hvis du returnerer et Promise, sørg for at det blir løst.
Hvordan løse dette paradokset?
Svar #1
Du må også fjerne done-parameteren, ikke bare kallet til den. Test-rammeverk som Mocha ser på funksjonens parameterliste (eller i det minste dens aritet) for å vite om du bruker done eller lignende.
Ved bruk av Mocha 3.5.3 fungerer dette for meg (jeg måtte endre true.should.be(true) til assert.ok(true) siden det første ga en feil):
const assert = require('assert');
function asyncFunction() {
return new Promise(resolve => {
setTimeout(resolve, 10);
});
}
describe('Container', function() {
describe('Foo', function() {
it("should pass the test", async function () {
await asyncFunction();
assert.ok(true);
});
});
});
Men hvis jeg legger til done:
describe('Container', function() {
describe('Foo', function() {
it("should pass the test", async function (done) { // <==== Here
await asyncFunction();
assert.ok(true);
});
});
});
...da får jeg
Feil: Tidsavbrudd på 2000 ms overskredet. For asynkrone tester og hooks, sørg for at "done()" kalles; hvis du returnerer et Promise, sørg for at det fullføres.
