Après la mise à niveau, Mocha ne peut même pas exécuter un simple test voici le code
const assert = require('assert');
it('should complete this test', function (done) {
return new Promise(function (resolve) {
assert.ok(true);
resolve();
})
.then(done);
});
J'ai pris ce code de ici
J'ai compris qu'il levait maintenant une exception Error: Resolution method is overspecified. Specify a callback * or * return a Promise; not both.
Mais comment le faire fonctionner? Je n'ai pas compris. j'ai
node -v 6.9.4
mocha -v 3.2.0
Comment exécuter ce code dans un nouveau format correct?
Laisse tomber.then(done);
et remplacez function(done)
par function()
Vous retournez une promesse donc l'appel fait est redondant comme il est dit dans le message d'erreur
Dans les anciennes versions, vous deviez utiliser le rappel en cas de méthodes asynchrones comme ça
it ('returns async', function(done) {
callAsync()
.then(function(result) {
assert.ok(result);
done();
});
})
Vous avez maintenant une alternative de retourner une promesse
it ('returns async', function() {
return new Promise(function (resolve) {
callAsync()
.then(function(result) {
assert.ok(result);
resolve();
});
});
})
Mais utiliser les deux est trompeur (voir par exemple ici https://github.com/mochajs/mocha/issues/2407 )
Mocha permet soit d'utiliser un rappel:
it('should complete this test', function (done) {
new Promise(function (resolve) {
assert.ok(true);
resolve();
})
.then(done);
});
OU retourne une promesse:
it('should complete this test', function () {
return new Promise(function (resolve) {
assert.ok(true);
resolve();
});
});
// Or in the async manner
it('should complete this test', async () => {
await Promise.resolve();
assert.ok(true);
});
Vous ne pouvez pas faire les deux.
J'ai eu ce même problème. Souvent, Mocha est associé à une autre bibliothèque appelée Chai. Chai a un paquet appelé "chai-as-promise". Il vous donne la possibilité super simple d'écrire moins de code et de tester les promesses. Dans le cas où vous testez simplement si une promesse se résout, elle semble parfaite.
const chai = require('chai');
const chaiAsPromised = require("chai-as-promised");
const should = require("chai").should();
chai.use(chaiAsPromised);
describe("Testing with correct syntax and non repeated names", () => {
it("Should give us a positive response", () => {
graphQL.sendToGQL(model,"specialEndpoint").should.eventually.be.an("Object");
})
})
Si vous n'avez pas de rappel, les réponses précédentes (qui suggèrent de supprimer le done
) sont correctes.
Si vous devez both attendre une promesse externe, puis exercer une implémentation basée sur callback/errback dans votre test, cette solution ne vous aide pas.
Vous pouvez utiliser une bibliothèque comme pify
pour convertir l'API de rappel pour utiliser des promesses.
Alternativement, vous pouvez utiliser un Latch
dans votre rappel:
it("test", async () => {
const l = new Latch()
const v = await promiseValue()
s.methodThatTakesCallback((err, result) => {
expect(result).to.eql(expected)
l.resolve() // < notifies mocha your test is done
})
return l.promise
})
Dans TypeScript, voici une implémentation de Latch très allégée:
/**
* Simple one-count concurrent barrier
*/
export class Latch {
readonly promise: Promise<void>
resolve!: () => void
constructor() {
this.promise = new Promise<void>(resolve => (this.resolve = resolve))
}
}
J'ai dû supprimer le done
du paramètre de fonction et le done()
de l'appel de fonction Before
before(async function (done) {
user = new User({ ...});
await user.save();
done()
});
Après
before(async function () {
user = new User({ ...});
await user.save();
});
Ces travaux pour moi