我正在尝试使用Lab来测试一些代码。但是,由于某种原因,当我放置正确的有效负载时,我的代码什么都不做承诺似乎没有得到回报:
'use strict';
const Server = require('../server');
const options = {
method: 'POST',
url: '/api/users',
payload: JSON.stringify({ mobile: '3342329224' })
};
Server.inject(options, (response) => {
if (response) {
console.log(response.payload);
}
else {
console.log('Nada');
}
});
如果我编辑代码以便没有有效负载或者它与我的Joi验证不匹配那么我得到回复:
{"statusCode":400,"error":"Bad Request","message":"child \"mobile\" fails because [\"mobile\" must be larger than or equal to 10]","validation":{"source":"payload","keys":["mobile"]}}
module.exports = {
method: 'POST',
path: '/api/users',
config: {
auth: false,
handler: (request, reply) => {
//looks up payload in db otherwise creates entry
User.findOne({
mobile: request.payload.mobile
}, (err, user) => {
if (err) {
throw err;
}
if (user) {
// uses twillio to send code
sendVerificationText(user, (err, result) => {
if (err){
throw err;
}
if (result === true) {
// this is what I expect to happen when testing
reply('code sent').code(201);
}
else {
throw Boom.badRequest(err);
}
});
}
else {
// the user should exist so....
const user = new User();
user.mobile = request.payload.mobile;
user.admin = false;
user.save((err, user) => {
if (err) {
throw Boom.badRequest(err);
}
sendVerificationText(user, (err, result) => {
if (err){
throw err;
}
if (result === true) {
reply('code sent').code(201);
}
else {
throw Boom.badRequest(err);
}
});
});
}
});
},
// Validate the payload against the Joi schema
validate: {
payload: createUserSchema
}
}
};
我应该提一下,当我运行服务器并手动测试api时,此代码有效。我无法弄清楚。
答案 0 :(得分:0)
抱歉原来的答案没有到达任何地方。我已经回去并尝试用实验室重新创建你的测试: https://github.com/davethomas11/stackoverlfow_Q_39432656/blob/master/test/users.js
它似乎不适合我。我收到了预期的响应代码。我根据实验室文档使用代码库(新依赖项)将一些断言放入函数中:
lab.test("user post", function (done) {
const options = {
method: 'POST',
url: '/api/users',
payload: JSON.stringify({ mobile: '3342329224' })
};
Server.inject(options, (response) => {
if (response) {
console.log(response.payload);
}
else {
console.log('Nada');
}
Code.expect(response.statusCode).to.equal(201);
Code.expect(response.payload).to.equal("code sent");
done();
});
});
好奇你在运行测试时看到的输出是什么?命令行是否只为您挂起?检查我的github项目,了解如何针对差异进行测试。希望这对你有所帮助。
哦..你知道你需要确保在测试中调用done()以使其结束;)可能为什么它会挂起你
原始答案供参考: 我尽我所能重建了你的环境。不得不说我喜欢这个hapi.js框架。非常好!快速获得服务器的方法。竖起大拇指。不错的选择。
以下是基于您发布的代码通过模拟找到的内容: https://github.com/davethomas11/stackoverlfow_Q_39432656
在该解决方案中,您将找到设置验证的位置:
validate: {
payload: createUserSchema
}
我假设 createUserSceme 是您设置为有效负载值的函数。如果它是一个函数,它将导致请求挂起并永远不会返回!因此,您看到的行为就好像永远不会返回承诺。服务器永远不会响应。如果我把它改成这个......
validate: {
payload: createUserSchema()
}
然后我们都没关系,验证可以继续。所以这里的目标是确保validate的值是一个对象。
请注意,我猜测了你的createUserSchema。所以,如果你想深入了解下一个问题。请发布更多代码,我很乐意尝试,看看我是否可以提供更多帮助=)(关闭更多Nacros第2季,我明天会回来查看)