Тайм-аут - асинхронный обратный вызов не был вызван в течение тайм-аута 5000 мс, указанного в jest.setTimeout - PullRequest
0 голосов
/ 06 октября 2018

Я тестирую API для функциональности пользователя (регистрация и вход в систему), используя jest.

Код для тестирования:

const request = require('supertest');
const app = require('../../app');

describe('Test User Functionality', () => {  
  test('User should be able to login', async done => {
    const response = await request(app)
      .post('/api/users/login')
      .send({
        email: 'test@test.com',
        password: 'welcome1',
      })
      .expect(200);
    done();
    //expect(response.statusCode).toBe(200);
  });
  test('User should be able to signup', async done => {
    const response = await request(app)
      .post('/api/users/signup')
      .send({
        username: 'testuser',
        email: 'test@test1.com',
        password: 'welcome1',
      })
      .expect(200);
    done();
    //expect(response.statusCode).toBe(200);
  });
});

Если у меня один тест, он работает нормально, но снесколько тестов внутри описания, он показывает ошибки тайм-аута.

Ниже приведен скриншот ошибки:

enter image description here

Я попытался добавить тайм-аут, поменять местами тест, но все равно безуспешно.

Кто-нибудь, пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Одна из возможных проблем может быть с промежуточным программным обеспечением Express.Чтобы выяснить, является ли это вашим случаем, вы можете:

  1. Закомментировать все промежуточные программы для вашего экспресс-приложения (app.use(/* middleware */) docs )
  2. Посмотретьтесты начинают как-то прогрессировать (пройти / не прервать)
  3. Начать раскомментировать промежуточное ПО, чтобы сузить его до виновника.

Как только вы найдете причину таймаутаприходит, вы можете пойти глубже.Смоделируйте различные части промежуточного программного обеспечения, которое вызывает проблему:

  1. Смоделируйте сторонние библиотеки, создав каталог __mocks__ в корневом каталоге и вставив файл library_name.js (это насмешка вручную для jest: документация )
  2. Смоделируйте промежуточные программы и пройдите через них, заставив их просто позвонить по следующему app.use(Your.Middleware) и в своем файле промежуточного программного обеспечения
/** Possibly imports and some setup here */

// Make sure the function being called is mocked
export default {
    Middleware: (req, res, next) => {
        next();
    },
}

(Файлсодержащий ваше промежуточное ПО может содержать некоторые дополнительные настройки, которые могут вызвать проблему.)

Мой конкретный случай: я использовал ioredis в промежуточном ПО и в файле при создании экземпляра Redis он несколько раз пытался подключиться к хранилищу, который вызвал тайм-аут.
Как оказалось, имя хоста было неверным.Ключом к решению этой проблемы было насмешка промежуточного программного обеспечения и поиск дополнительных настроек.Затем Jest показал еще одну ошибку, намекая на проблемы с подключением к магазину.

0 голосов
/ 08 октября 2018

Я столкнулся с той же проблемой при тестировании моего реагирующего компонента с асинхронными запросами.

Это происходит потому, что вы не выполнили свой запрос должным образом.

Вы можете легко решить эту проблему.

Опция 1: переместите done в качестве второго параметра для вызова функции expect, как показано ниже.

const response = await request(app)
  .post('/api/users/signup')
  .send({
    username: 'testuser',
    email: 'test@test1.com',
    password: 'welcome1',
  })
  .expect(200, done);

Опция 2: используйте end метод

const response = await request(app)
      .post('/api/users/signup')
      .send({
        username: 'testuser',
        email: 'test@test1.com',
        password: 'welcome1',
      })
      .expect(200)
      .end((err, res) => { 
        // do anything you want! 
      })

Или вы можете оформить заказ (https://github.com/visionmedia/supertest#readme)!

...