0

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 をテストすると機能することに注意してください。私はそれを理解することはできません。

4

1 に答える 1

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フレームワークが好きだと言わざるを得ません。非常に素晴らしい!サーバーを立ち上げる簡単な方法。いいぞ。良い選択です。

投稿されたコードに基づいてモックして見つけたものは次のとおりです

そのソリューションでは、検証を設定した場所が見つかります。

validate: {
            payload: createUserSchema
        }

createUserScemeは、ペイロードの値として設定している関数だと思います。それが関数の場合、リクエストがハングし、返されなくなります! したがって、約束が決して返されないかのように見える動作です。サーバーが応答しません。これに変えたら…

validate: {
            payload: createUserSchema()
        }

その後、すべて問題なく、検証を続行できます。したがって、ここでの目標は、validate の値がオブジェクトであることを確認することです。

推測で createUserSchema を嘲笑したことに注意してください。それで、次の問題の根底に行きたいのなら。もっとコードを投稿してください。もっとお役に立てるかどうか喜んで試してみます =)

于 2016-09-11T05:05:09.547 に答える