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');
});
Другие вопросы по тегам