Итак, у меня есть этот код ниже. Он удаляет базу данных и добавляет двух пользователей для тестового примера. когда я проверяю его вручную в базе данных mongo, все показывает правильно, но в тестовом примере мокко я получаю ошибку тайм-аута даже после определения аргумента done и его вызова.
Пожалуйста помоги мне с этим.
const users = [{
_id: new ObjectID(),
email: 'First'
}, {
_id: new ObjectID(),
email: 'Second'
}];
beforeEach((done) => {
User.remove({}).then(() => {
return User.insertMany(users);
}).then(() => done());
})
Под «будущим» я подразумеваю «обещание» :)
нет, я пробовал это, но ошибок не обнаружено .. выводится та же ошибка ..
В режиме мокко время ожидания тестов по умолчанию истекает через 2000 мс. Даже если вы обрабатывали асинхронность на 100% правильно (а это не так), если вы выполняете асинхронную операцию, которая занимает более 2 секунд, mocha примет сбой. Это верно, даже если асинхронная операция выполняется в beforeEach
или другом хуке.
Чтобы изменить это, вам нужно вызвать метод timeout
в тестовом экземпляре, присвоив ему достаточно высокое значение. Чтобы получить доступ к экземпляру теста, вам необходимо определить свои тестовые функции, используя ключевое слово function
, а не синтаксис стрелки, и он будет доступен как this
в ваших тестовых функциях:
beforeEach(function(done) {
this.timeout(6000); // For 6 seconds.
User.remove({}).then(() => {
return User.insertMany(users);
}).then(() => done());
});
Но каким образом вы могли бы лучше справиться с асинхронностью? Как отметил Хенрик в комментариях, вы никогда не вызовете done
, если какой-либо из вызовов вашей базы данных завершится неудачно. Однако, честно говоря, поскольку вы уже имеете дело с обещаниями, вам даже не следует использовать обратный вызов done
. Вместо этого просто используйте встроенную поддержку обещаний Mocha, вернув связанное обещание.
beforeEach(function() {
this.timeout(6000); // For 6 seconds.
return User.remove({})
.then(() => User.insertMany(users));
});
Таким образом, если одно из этих обещаний будет отклонено, Mocha узнает об этом и покажет отказ, вместо того, чтобы просто сидеть и ждать, пока истечет время ожидания вашего теста.
Вы даже можете использовать async/await
, если предпочитаете:
beforeEach(async function() {
this.timeout(6000); // For 6 seconds.
await User.remove({});
await User.insertMany(users);
});
Возможно,
return User.insertMany(users);
выдает ошибку. Попробуйте добавить операторcatch
в свой future и посмотрите, будет ли он вызван.