Вызов POST-запроса server.inject() без вызова обработчика в Hapi.js

У меня есть тестовая спецификация Jasmine test_spec.js, например:

describe('my tests', () => {
  it('POST should return 201 created', () => {
    var req = {
      method: 'POST',
      url: '/api/v1.0/message',
      payload: JSON.stringify({name: 'Ethan'})
    };
    server.inject(req, res => {
      expect(res.statusCode).to.equal(201);
    });
  });
});

Маршрут вызова API выглядит следующим образом:

var routes = [{
  path: '/api/v1.0/message',
  method: 'POST',
  handler: function(request, reply) {
    reply('Success').created();
  }
}];
exports.register = function(server, options, next) {
  server.route(routes);
  next();
}

Однако, когда я запускаю тесты, функция expect() этого конкретного теста не вызывается, потому что метод server.inject() не вызывает обратный вызов ответа. На самом деле даже метод обработчика маршрута не вызывается (я проверял с помощью операторов console.log). Однако, когда я меняю метод запроса и маршрут с POST на GET, он работает, и тест вызывает метод expect(), как и ожидалось. Тест просто не работает с запросами POST. Я делаю это неправильно?


person pkout    schedule 17.05.2016    source источник
comment
Можете ли вы сделать полный рабочий пример этого (извлеките его из своего приложения, если он большой), а не фрагменты?   -  person Matt Harrison    schedule 17.05.2016
comment
Я объединил определение маршрута и обработчик маршрута, чтобы упростить код. Если бы я также вставил сюда шаблонный код Hapi, это сделало бы его неуклюжим. Чтобы воспроизвести это, можно просто взять шаблон Hapi и вставить указанный выше маршрут + обработчик. Затем записывает приведенный выше тест Jasmine и выполняет его с помощью команды jasmine в терминале.   -  person pkout    schedule 17.05.2016
comment
Я не согласен. Если вы предоставите минимальный рабочий пример, который мы можем запустить, нам будет легче помочь. Я ничего не могу сделать с вышеперечисленным, потому что это выглядит нормально. Ваша проблема, вероятно, лежит за пределами того, что вы предоставили.   -  person Matt Harrison    schedule 17.05.2016
comment
Вы правы. Я потратил время, чтобы сгенерировать абсолютный минимум примера, и он работал там, поэтому это должно быть привязано к чему-то еще в коде. Очень странный. Я сообщу здесь, когда узнаю, что это было, на случай, если это может помочь другим. Благодарю вас!   -  person pkout    schedule 17.05.2016


Ответы (1)


Оказывается, проблема была во фрагменте тестового вызова describe(), опубликованном в моем вопросе. Я забыл вызвать функцию done() внутри вызова server.inject(). Как только я добавил это, тест POST начал вызываться:

describe('my tests', () => {
  it('POST should return 201 created', (done) => {
    var req = {
      method: 'POST',
      url: '/api/v1.0/message',
      payload: JSON.stringify({name: 'Ethan'})
    };
    server.inject(req, res => {
      expect(res.statusCode).toEqual(201);
      done();
    });
  });
});

Необходимость вызова обратного вызова done() не была очевидна для меня из документации Jasmine. Вызов необходим для того, чтобы отложить завершение спецификации до тех пор, пока не будет вызван done() (что означает отправку полезной нагрузки).

person pkout    schedule 17.05.2016
comment
Я бы всегда использовал обратный ответ при вызове обратного вызова ответа - person simon-p-r; 17.05.2016