hapi.js 实验室测试,server.js 总是 returns 404 状态
hapi.js Lab testing, server.js always returns 404 status
我正在评估 hapi.js。在我开始编写测试之前一切都很顺利。基本上我试图将状态代码作为第一步进行测试。但是我无法继续进行。 Server.inject always returns 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();
});
});
断言似乎从未成功通过,我已确保路由可用。
编辑:正如 Matt Harrison 正确指出的那样,我实际上是在异步加载路由。
这些场景如何测试?
您的测试看起来一切正常。为了证明这一点,如果你把它放在你的 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 /
路由,当您的测试获得 运行 时它不在路由 table 中。为什么会发生这种情况?一些插件不会立即调用注册回调,因为它们需要时间来设置自己。如果您在此回调中注册您的路由,则当您的测试获得 运行 时,它们不会被加载。例如,对于您的测试,这将失败并返回 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
延迟 运行ning 测试直到服务器发出 pluginsLoaded
事件:
...
lab.before(function (done) {
server.on('pluginsLoaded', done);
});
...
你只需要确保在 index.js
:
server.register(..., function (err) {
server.route({
...
});
server.emit('pluginsLoaded');
});
我正在评估 hapi.js。在我开始编写测试之前一切都很顺利。基本上我试图将状态代码作为第一步进行测试。但是我无法继续进行。 Server.inject always returns 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();
});
});
断言似乎从未成功通过,我已确保路由可用。
编辑:正如 Matt Harrison 正确指出的那样,我实际上是在异步加载路由。
这些场景如何测试?
您的测试看起来一切正常。为了证明这一点,如果你把它放在你的 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 /
路由,当您的测试获得 运行 时它不在路由 table 中。为什么会发生这种情况?一些插件不会立即调用注册回调,因为它们需要时间来设置自己。如果您在此回调中注册您的路由,则当您的测试获得 运行 时,它们不会被加载。例如,对于您的测试,这将失败并返回 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
延迟 运行ning 测试直到服务器发出 pluginsLoaded
事件:
...
lab.before(function (done) {
server.on('pluginsLoaded', done);
});
...
你只需要确保在 index.js
:
server.register(..., function (err) {
server.route({
...
});
server.emit('pluginsLoaded');
});