【问题标题】:hapi.js Lab testing, server.js always returns 404 statushapi.js 实验室测试,server.js 总是返回 404 状态
【发布时间】:2016-07-22 00:16:39
【问题描述】:

我正在评估 hapi.js。一切都很顺利,直到我开始编写测试。基本上我试图测试状态代码作为第一步。但是我无法继续进行。 Server.inject 总是返回 404。我通过运行服务器并使用 fiddler(像 postman 这样的 http 请求模拟工具)发送 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();
    });
});

断言似乎从未成功通过,我已确保路由可用。

编辑:正如马特哈里森正确指出的那样,我实际上是在异步加载路由。

如何在这些场景中进行测试?

【问题讨论】:

  • index.js 文件里有什么?

标签: javascript unit-testing hapijs lab


【解决方案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');
});

【讨论】:

  • 你说得对,路由都是在这样的回调中加载的,这种情况下怎么测试?
  • 太棒了,你让我去哈皮,因为这是唯一阻止我的地方
  • 确实,这个解决方案是正确的做法。一句话:要捕获“pluginsloaded”事件,您应该捕获“start”事件(hapijs.com/api#internal-events
  • 对于解决方案,您还需要使用server.event('pluginsLoaded') 创建事件,否则您会收到一个错误,发出该事件:hapijs.com/api#serveremitcriteria-data-callback
猜你喜欢
  • 1970-01-01
  • 2016-06-03
  • 2022-11-26
  • 2021-05-16
  • 1970-01-01
  • 2017-08-10
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多