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.

Relaterte artikler