Ошибка «Превышено время ожидания 2000 мс» в mocha - PullRequest
0 голосов
/ 01 мая 2018

Так что у меня есть этот код ниже. Он удаляет базу данных и добавляет двух пользователей для теста. когда я проверяю это вручную в базе данных mongo, все показывается правильно, но в тестовом случае mocha я получаю ошибку тайм-аута даже после определения аргумента done и его вызова.

Пожалуйста, помогите мне в этом.

const users = [{
  _id: new ObjectID(),
  email: 'First'
}, {
  _id: new ObjectID(),
  email: 'Second'
}];

beforeEach((done) => {
  User.remove({}).then(() => {
    return User.insertMany(users);
  }).then(() => done());
 
})

1 Ответ

0 голосов
/ 29 мая 2018

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

Таким образом, если одно из этих обещаний будет отклонено, Мокко узнает об этом и покажет отклонение, вместо того, чтобы просто сидеть и ждать, пока ваш тест истечет.

Вы даже можете использовать async/await вместо этого, если предпочитаете:

beforeEach(async function() {
  this.timeout(6000); // For 6 seconds.
  await User.remove({});
  await User.insertMany(users);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...