node-mocks-http не испускает событие 'end' - PullRequest
0 голосов
/ 06 марта 2019

ОК, поэтому у меня есть все эти тесты, которые зависят от node-mocks-http в mocha для проверки моих контроллеров express.js, и они все еще работают просто отлично.

Проблема в том, что любой новыйтесты, которые я создаю, отказываются выдавать событие 'end' и заканчивать.Настало время, когда я решил написать очень простую функцию контроллера и протестировать ее в совершенно новом проекте, и я до сих пор не получаю событие 'end' для запуска.

Это мой контроллер (индекс.js):

exports.testFunc = function(req, res) {
  res.status(200).json({
    status: 'success',
    status_message: 'OK',
    data: {
      firstRun: true
    }
 });
}

И это мой тест (test.js):

let httpMocks = require('node-mocks-http');

let request = httpMocks.createRequest({
    method: 'GET',
    url: '/test',
});

let response = httpMocks.createResponse({
    eventEmitter: require('events').EventEmitter
});

const loadingController = require('./index');

describe('loadingController:', () => {

    describe('first_run_status: ', () => {
        it('should really respond here', (done) => {
            loadingController.testFunc(request, response);
            response.on('end', () => {
                done();
            });
        });
    });
});

Это точный код, с которым я работаю

./node_modules/mocha/bin/_mocha ./test.js --timeout 10000 --exit

Это абсолютно отказывается выдавать событие 'end' и завершать тест ...

Это действительно сводит меня с ума, кто-нибудь может увидеть, что здесь не так?или что может сделать это не работает?

FYI когда я регистрирую объект ответа на консоли перед запуском testFunc, я вижу закончен: ложь и когда явойдите в систему после того, как я увижу

EventEmitter {
  _headers: { 'content-type': 'application/json' },
  cookies: {},
  finished: true,
  headersSent: true,
  statusCode: 200,
  ....etc.

, что закончено: true , так почему бы не вызвать событие 'end'?

1 Ответ

0 голосов
/ 06 марта 2019

Ладно, я уверен, что я понял это ... потребовалось, как я не знаю 8 часов споров и приступил к проверке излучателя событий объектов отклика на низком уровне на каждом этапе этого простого эксперимента. Вы должны подключить источник событий, например,

response.on('end', () => {

});

test.test(request, response);

ДО того, как вы вызовете функцию маршрута ... вроде нет, но эй, может быть, это спасет кого-то от боли.

Вы ДОЛЖНЫ поместить response.on ('end', () => ... прежде чем вызывать свой маршрут / функцию ...

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

но я думаю, что люди, которые понимают js на экспертном уровне, уже знают подобные вещи о EventEmmiters.

... кажется очевидным в ретроспективе, но поскольку мой код работал (все еще работает) с подключенным задом наперед, это было менее очевидно. Единственная причина, по которой это работало для меня повсюду в моем приложении, даже если я делал это задом наперед ВЕЗДЕ, вызывая тестовый маршрут / контроллер перед подключением генератора событий, потому что по какой-то глупой удаче все мои маршруты заняли достаточно миллисекунд, чтобы событие не генерировалось до тех пор, пока обработчик события не смог его подключить ... поэтому, когда я начал преобразовывать все в синхронность и гораздо больше юнитов, он внезапно перестал работать.

Надеюсь, что в будущем это произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...