Получение ошибки "Превышено время ожидания 2000 мс" в мокко

Итак, у меня есть этот код ниже. Он удаляет базу данных и добавляет двух пользователей для тестового примера. когда я проверяю его вручную в базе данных 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());
 
})

Возможно, return User.insertMany(users); выдает ошибку. Попробуйте добавить оператор catch в свой future и посмотрите, будет ли он вызван.

Henrik Aasted Sørensen 01.05.2018 09:38

Под «будущим» я подразумеваю «обещание» :)

Henrik Aasted Sørensen 01.05.2018 09:58

нет, я пробовал это, но ошибок не обнаружено .. выводится та же ошибка ..

Vikrant Pradhan 01.05.2018 11:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
234
1

Ответы 1

В режиме мокко время ожидания тестов по умолчанию истекает через 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);
});

Другие вопросы по теме