带有hapijs的server.inject没有返回正确的响应

时间:2016-09-11 03:47:12

标签: mongodb hapijs lab

我正在尝试使用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时,此代码有效。我无法弄清楚。

1 个答案:

答案 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季,我明天会回来查看)