Почему мой тайм-аут превышен?

#node.js #express #mocha.js #supertest

#node.js #экспресс #mocha.js #супертест

Вопрос:

Я разрабатываю API с Node.js и Express, и я использую Mocha и Supertest для написания модульных тестов. У меня есть БОЛЬШОЙ файл тестов, которые проверяют каждый маршрут с почти случайными параметрами, чтобы увидеть, хорошо ли работает моя обработка ошибок.

Все было отлично, пока без всякой причины мои запросы не начали истекать.

Это более или менее мой код :

 var supertest = require("supertest");
var should = require("should");

var server = supertest.agent("http://localhost:3000");

function requestAuth(url, type, auth, params, callback) {
  if (params == null) {
    server[type](url)
    .type('form')
    .auth(auth.email, auth.password)
    .expect("Content-type",/json/)
    .expect(200)
    .end(callback);
  }
  else {
    server[type](url)
    .send(params)
    .auth(auth.email, auth.password)
    .type('form')
    .expect("Content-type",/json/)
    .expect(200)
    .end(callback);
  }
}

describe('Testing route 1', function() {
  describe('Testing param 1 error handling', function() {
    it('should return error 1', function(done) {
      requestAuth(route1, "post", {email: email, password: password}, {param1: "blahblahblah"}, 
      function(err, res) {
        res.body.should.have.property('error');
        done();
      });
    });
    it('should return error 2', function(done) {
      requestAuth(route1, "post", {email: email, password: password}, {param1: "blahblahblah"}, 
      function(err, res) {
        res.body.should.have.property('error');
        done();
      });
    });
    // etc
  });
  describe('Testing param 2 error handling', function() {
    it('should return error 3', function(done) {
      requestAuth(route1, "post", {email: email, password: password}, {param1: "blahblahblah"}, 
      function(err, res) {
        res.body.should.have.property('error');
        done();
      });
    });
    it('should return error 4', function(done) {
      requestAuth(route1, "post", {email: email, password: password}, {param1: "blahblahblah"}, 
      function(err, res) {
        res.body.should.have.property('error');
        done();
      });
    });
    // etc
  });
  //etc
});

describe('Testing route 2', function() {
  //etc
}); 
  

За исключением того, что у меня много тестов.
В какой-то момент допустим, что когда я тестирую маршрут 8, все тесты начинают завершаться сбоем со следующим сообщением :

   12) Route 8 Testing Param 1 error handling should return error 1:
     Error: timeout of 2000ms exceeded
      at null.<anonymous> (/usr/lib/nodejs/mocha/lib/runnable.js:139:19)
      at Timer.listOnTimeout (timers.js:92:15)
  

Я действительно не понимаю. С тех пор все работало хорошо, done вызывается в конце каждого запроса, должно быть хорошо. На стороне сервера ничего не происходит, хотя маршруты в порядке. Это действительно странно…

Кроме того, если тесты маршрута 8 становятся странными, и я, например, комментирую тесты маршрута 7, тесты маршрута 9 начнут действовать неправильно.

Я думаю, что это происходит от supertest. Возможно ли, что он перегружен? Как я мог это исправить?

Заранее спасибо за ваши ответы.

Ответ №1:

Сами ваши тесты имеют ограничение по времени для завершения ваших действий. Это означает, что если ресурс не настроен и не доступен в течение этих двух секунд, или если тест завершится через две секунды, он завершится неудачей. Используйте this.timeout = [milliseconds] в качестве первой строки неудачного теста для продления времени ожидания.

Тайм-ауты уровня тестирования MochaJS

Комментарии:

1. Да, я это знаю. Мой запрос не занимает более 2 секунд, он даже не доходит до API.

2. Вы пробовали перенести инициализацию вашего сервера в оператор before для каждого из ваших более крупных наборов? Возможно, ваши асинхронные вызовы действуют точно так, как они ожидают, и вызывают у вас только странности, потому что сервер отключается до завершения всех запросов.

3. Это немного сложно разгадать, учитывая, что это зависит от количества тестов. Это звучит как проблема с асинхронностью, и Express определенно не должен не отвечать, если он просто не запущен.

4. пытался повторно инициализировать мой сервер до сбоя тестов, он все равно терпит неудачу. это непостижимо.

5. Хорошо, нашел проблему… Ничего общего с supertest или express, но mysql. Я забыл освободить соединение с базой данных, поэтому после x запросов пул не мог предоставить больше соединений, заставляя API ждать. Глупо с моей стороны.