Для асинхронных тестов и перехватчиков убедитесь, что вызывается "done()"; если возвращение обещания, убедитесь, что оно разрешило

У меня есть этот тест nodejs при тестировании. Я получаю ошибку проделанной функции, не объявленной.

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

Мой тестовый код: у меня есть сделанный обратный вызов, но все еще получаю ошибку, чтобы вызвать done();

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

Ответ 1

Я столкнулся с той же проблемой, помогла ссылка @MFAL в комментарии. Я расширяюсь на этом.

При наличии ошибки/неверного утверждения в обещании возникает ошибка. Это приводит к отказу от обещаний. После отклонения сделано никогда не вызывается, и мокко сообщает об истечении времени ожидания. Я решил это, написав блок .catch и .catch его обещанием:

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

Другие способы, упомянутые в блоге Wietse:

Цепочка then(done, done) которая обрабатывает как решение, так и отклонение обещания.

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

Вернуть обещание:

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

Используйте async/wait:

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

Ответ 2

Я знаю ужасный способ сделать это, просто увеличив время ожидания Mocha по умолчанию с 2 секунд до 10 секунд, это можно сделать, добавив флаг --timeout 10000 в тестовые сценарии, т.е.

package.json

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

Ответ 3

в файле package.json вы можете исправить эту ошибку, используя --timeout 1500, как я использую ниже.

"scripts": {
  "start": "node server/server.js",
  "test": "export NODE_ENV=test || SET \"NODE_ENV=test\" && mocha --timeout 15000 server/**/*.test.js",
  "test-watch": "nodemon --exec 'npm test'"
   }

эта ошибка происходит из-за мокко.

Ответ 4

Вы можете просто добавить время ожидания к определенному тесту, чтобы увеличить/переопределить время ожидания по умолчанию, которое составляет 2 секунды. У меня была та же проблема, но я смог ее обойти, используя:

it('Test', (done) => { 
//your code  
done();
}).timeout(10000);

Ответ 5

Идея состоит в том, чтобы увеличить время ожидания.
Альтернативный способ - сделать это только требуемым способом:

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

Это поможет мне решить проблему.