Для асинхронных тестов и перехватчиков убедитесь, что вызывается "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();
});
Это поможет мне решить проблему.