hapi.js Лабораторное тестирование, server.js всегда возвращает статус 404
Я нахожусь в процессе оценки hapi.js. Все шло хорошо, пока я не начал писать тесты. В основном я пытаюсь проверить код состояния в качестве первого шага. однако я не могу продолжать дальше. Server.inject всегда возвращает 404. Я тестировал один и тот же код, запустив сервер и отправив http-запросы с помощью fiddler (инструмента моделирования http-запросов, такого как почтальон). Это успешно. Я не знаю, что я делаю не так. Я следую точным шагам, как во многих онлайн-уроках. Тестовый код выглядит следующим образом.
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();
});
});
Кажется, утверждение никогда не проходит успешно, я убедился, что маршруты доступны.
РЕДАКТИРОВАТЬ: Как правильно указал Мэтт Харрисон, я фактически загружаю маршруты асинхронно.
Как проверить в этих сценариях?
1 ответ
Все выглядит хорошо с вашим тестом. Чтобы доказать это, если вы поместите это в файл 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');
});