web-dev-qa-db-fra.com

Pour les tests asynchrones et les hooks, assurez-vous que "done ()" est appelé; si vous retournez une promesse, assurez-vous qu'elle soit résolue

J'ai ce test de nodejs lors du test, j'obtiens une erreur de fonction done non déclarée.

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

Mon code de test est le suivant: le rappel est fait, mais l'erreur d'appeler le done(); reste

    it('remove existing subdocument', (done) => {
    const Vic = new User({
      name: 'Vic',
      posts: [{ title: 'Leaning Nodejs' }]
    });

    vic.save()
      .then(() => User.findOne({ name: 'Vic' }))
      .then((user) => {
        const post = user.posts[0];
        post.remove();
        return user.save();
      })
      .then(() => User.findOne({ name: 'Vic' }))
      .then((user) => {
        assert(user.posts.length === 0);
        done();
      });
  });
12
Gerald Brigen

Je faisais face au même problème, le lien de @ MFAL dans le commentaire a aidé. Je développe sur elle.

En cas d'erreur/d'assertion incorrecte, une erreur est générée dans la promesse. Cela conduit à une promesse de rejet. Une fois rejetée, done n'est jamais appelée et le rapport mocha expire ..__ J'ai résolu ce problème en écrivant un bloc .catch et en l'enchainant avec la promesse

          it('resolves', (done) => {
            fooAsyncPromise(arg1, arg2).then((res, body) => {
                expect(res.statusCode).equal(incorrectValue);
                done();
            }).catch(done);
         });

Les autres moyens mentionnés dans le blog de Wietse sont:

Pour chaîner une then(done, done) qui gère à la fois la résolution et le rejet de la promesse.

         it('resolves', (done) => {
           resolvingPromise.then( (result) => {
             expect(result).to.equal('promise resolved');
           }).then(done, done);
         });

Renvoyer une promesse:

        it('resolves', () => {
          return resolvingPromise.then( (result) => {
            expect(result).to.equal('promise resolved');
          });
        });

Utilisez async/wait:

        it('assertion success', async () => {
          const result = await resolvingPromise;
          expect(result).to.equal('promise resolved'); 
        });
14
avck

Je connais une façon laide de le faire, simplement en augmentant le délai d’exécution par défaut de Mocha de2 secondes à 10 secondesceci peut être effectué en ajoutant un indicateur - timeout 10000 dans les scripts de test i.e -

package.json

 "scripts": {
    "start": "SET NODE_ENV=dev && node server.js",
    "test": "mocha --timeout 10000"
  }
9

L'idée est d'augmenter le délai d'attente.
Une autre façon est de le faire uniquement avec la méthode requise:

 it('remove existing subdocument', function(done) {
         this.timeout(10000);
      //your code is here
      done();
    });

Cela m'aide à résoudre le problème.

0
Mr.B