web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens "Erreur: la méthode de résolution est sur-spécifiée"?

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?

29
coder fire

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 )

32
Igor

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.

6
Simon Boudrias

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");
    })
})

0
Justin Rice

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))
  }
}
0
mrm

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

0
kheengz