2015-07-14 7 views
2

Я в процессе оценки hapi.js. Все шло хорошо, пока я не начал писать тесты. В основном я пытаюсь проверить код состояния как первый шаг. однако я не могу идти дальше. Server.inject всегда возвращает 404. Я протестировал один и тот же код, запустив сервер и отправив http-запросы с помощью скрипта (средство моделирования запросов HTTP, такое как почтальон). Это успешно. Я не знаю, что я делаю неправильно. Я выполняю точные шаги, как во многих учебниках онлайн. Код проверки выглядит следующим образом.hapi.js Лабораторное тестирование, server.js всегда возвращает статус 404

var Lab = require("lab"); 
var server = require("../server/index.js").server; 
var lab = exports.lab = Lab.script(); 
var code = require("code"); 

lab.test("home", function (done) { 
    var options = { 
     method: "GET", 
     url: "/" 
    } 
    server.inject(options, function (response) { 
     var result = response.result; 
     code.expect(response.statusCode).to.equal(200); 
     done(); 
    }); 
}); 

Утверждение никогда не проходит успешно, я убедился, что маршруты доступны.

EDIT: Как правильно указал Мэтт Харрисон, я фактически загружаю маршруты асинхронно.

Как проверить в этих сценариях?

+1

Что входит в файл index.js? –

ответ

4

Все выглядит нормально с вашим тестом. Чтобы доказать это, если вы поместите это в вашем index.js файл, он должен работать:

var Hapi = require('hapi'); 
var server = new Hapi.Server(); 

server.connection({ port: 4000 }); 

server.route({ 
    method: 'GET', 
    path: '/', 
    handler: function (request, reply) { 

     reply('ok'); 
    } 
}); 

exports.server = server; 

не видя, что происходит в вашем файле index.js я могу только сделать обоснованное предположение. Но здесь все равно ...

Одна из возможностей заключается в том, что вы добавляете маршрут GET / асинхронно, и он не находится в таблице маршрутизации, когда ваш тест запускается. Почему это может произойти? Некоторые плагины не вызывают обратный вызов регистра немедленно, потому что им нужно время, чтобы настроить себя. Если вы регистрируете свои маршруты в этом обратном вызове, они не загружаются, когда ваш тест запускается. Например, это будет терпеть неудачу с 404 для теста:

var Hapi = require('hapi'); 
var server = new Hapi.Server(); 

server.connection({ port: 4000 }); 

var fakePlugin = function (server, options, next) { 

    setTimeout(next, 500); 
}; 

fakePlugin.attributes = { name: 'fake' }; 

server.register(fakePlugin, function (err) { 

    server.route({ 
     method: 'GET', 
     path: '/', 
     handler: function (request, reply) { 

      reply('ok'); 
     } 
    }); 
}); 

exports.server = server; 

РЕШЕНИЯ:

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

Добавить before к тесту, что задерживает выполнение тестов, пока сервер не выдает pluginsLoaded события:

... 

lab.before(function (done) { 

    server.on('pluginsLoaded', done); 
}); 

... 

И вам просто нужно, чтобы убедиться, что вы испускаете, что в вашем index.js:

server.register(..., function (err) { 

    server.route({ 
     ... 
    }); 

    server.emit('pluginsLoaded'); 
}); 
+0

Вы правы, маршруты загружаются в такие обратные вызовы, как я могу проверить в такой ситуации? –

+1

@SrivathsaHarishVenkataramana Я обновил свой ответ –

+0

Удивительно, вы просто заставили меня пойти на Хапи, так как это был единственный бит, останавливающий меня –