ValidationError: дочерний «пароль» завершается ошибкой, потому что [«пароль» требуется] - PullRequest
0 голосов
/ 16 января 2019

ValidationError: дочерний «пароль» завершается ошибкой, поскольку [«пароль» требуется] при запуске теста отображается ошибка

Я использую hapijs v17.2.3 и mongodb в качестве серверной части. Я пытаюсь выполнить модульное тестирование, используя lab и code. Это мой tests.js

'use strict';

const Hapi = require('hapi');
const application = require('../app');
const Code = require('code');
const Lab = require('lab');
const lab = exports.lab = Lab.script();
const getServer = function () {
    const server = new Hapi.Server();
    server.connection();
    return server.register(application)
        .then(() => server);
};

 ......
 ......
 ......


lab.test('Simply test the unique route', (done) => {

    const signUpData = {
        method: 'POST',
        url: '/signup',
        payload: {
            name: 'vulcan',
            password: 'vulcan@123',
            verify: 'vulcan@123',
            email: 'vulcan@gmail.com',
            username: 'vulcan',
            referredBy: 'admin@gg',
            dob: '12/08/1994'
        }
    };

    getServer()
        .then((server) => server.inject(signUpData))
        .then((response) => {

            Code.expect(response.statusCode).to.equal(200);
            const payload = JSON.parse(response.payload);
            Code.expect(payload).to.exist();

            done();
        })
        .catch(done);
});

когда я запускаю приведенный выше код, я получил следующую ошибку

{ ValidationError: child "password" fails because ["password" is required]
    at Object.exports.process (/home/jeslin/projects/hapi/gamergully/node_modules/joi/lib/errors.js:196:19)
    at internals.Object._validateWithOptions (/home/jeslin/projects/hapi/gamergully/node_modules/joi/lib/types/any/index.js:675:31)
    at module.exports.internals.Any.root.validate (/home/jeslin/projects/hapi/gamergully/node_modules/joi/lib/index.js:146:23)
    at Object.internals.implementation [as cookie] (/home/jeslin/projects/hapi/gamergully/node_modules/hapi-auth-cookie/lib/index.js:95:25)
    at module.exports.internals.Auth._strategy (/home/jeslin/projects/hapi/gamergully/node_modules/hapi/lib/auth.js:52:47)
    at Object.register (/home/jeslin/projects/hapi/gamergully/lib/auth.js:6:116)
    at internals.Server.register (/home/jeslin/projects/hapi/gamergully/node_modules/hapi/lib/server.js:451:35)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:189:7)
    at Function.Module.runMain (module.js:696:11)
    at startup (bootstrap_node.js:204:16)
    at bootstrap_node.js:625:3
  isJoi: true,
  name: 'ValidationError',
  details:
   [ { message: '"password" is required',
       path: [Array],
       type: 'any.required',
       context: [Object] } ],
  _object:
   { password: undefined,
     cookie: 'GG-auth',
     isSecure: false,
     clearInvalid: true,
     ttl: 86400000,
     redirectTo: '/login',
     appendNext: true,
     redirectOnTry: false,
     isSameSite: 'Lax' },
  annotate: [Function] }

Я не могу понять, что это за ошибка, и я потратил много времени на ее устранение

это мой контроллер для регистрации, который имеет все проверки с joi

exports.postForm = {
    description: 'Submit the signup page',
    tags: ['api'],
    notes: 'accepts name password verify and email',

    auth: {
        mode: 'try',
        strategy: 'session'
    },
    validate: {
        payload: {
            name: Joi.string().required(),
            password: Joi.string().min(4).max(20).required(),
            verify: Joi.string().required(),
            email: Joi.string().email().required(),
            username: Joi.string().min(3).max(20).required(),
            referredBy: Joi.any(),
            dob: Joi.date().required().label('Date of Birth')
        },
        failAction: (request, h, error) => {
            // Boom bad request
            console.log('Validation Failed');
            request.yar.flash('error', error.details[0].message.replace(/['"]+/g, ''));
            return h.redirect('/signup').takeover();
        }
    },
    handler: async (request, h) => {
        try {

            ................

            ................

            var user = {
                name: request.payload.name,
                password: reques67t.payload.password,
                email: request.payload.email,
                username: request.payload.username,
                referralName: request.payload.username + '@gg',
                emailConfirmationToken: uuidv1(),
                dob: request.payload.dob
            };
            // Then save the user
            let data = await signupHelper.signUpUser(user, request);
            if (data.statusCode === 200) {

                if (request.payload.referredBy) {

                    request.yar.flash('success', 'Account created, Please Login');

                }
            } else {
                request.yar.flash('error', data.message);
                return h.redirect('/signup');
            }
        } catch (error) {
            console.log('error occired = ', error);

            return h.redirect('/signup');
        }
    }
};

1 Ответ

0 голосов
/ 16 января 2019

Я создал простой тестовый костюм, и он прошел. Я не смог определить проблему с твоей проверкой Джои.

const Lab = require('lab');
const lab = exports.lab = Lab.script();
const describe = lab.describe;
const it = lab.it;
const expect = require('code').expect;
const Joi = require('joi');
describe('Validator accountSetupToken checks', () => {

    let validation = Joi.object().keys({
        name: Joi.string().required(),
        password: Joi.string().min(4).max(20).required(),
        verify: Joi.string().required(),
        email: Joi.string().email().required(),
        username: Joi.string().min(3).max(20).required(),
        referredBy: Joi.any(),
        dob: Joi.date().required().label('Date of Birth')
    });

    it('Reject invalid payload', async () => {
        const result = Joi.validate({
            name: 'vulcan',
            password: 'vulcan@123',
            verify: 'vulcan@123',
            email: 'vulcan@gmail.com',
            username: 'vulcan',
            referredBy: 'admin@gg',
            dob: '12/08/1994'
        }, validation, {abortEarly: false});
        expect(result.error).to.null();
        expect(result.error).to.not.exist();
    });

});

Вот результат.

> lab --coverage-exclude test/data -m 5000n -a code -P "simple" "test/validators"


  .

1 tests complete
Test duration: 13 ms
Assertions count: 2 (verbosity: 2.00)
No global variable leaks detected

Но тогда я увидел в вашем сообщении об исключении это

details:
   [ { message: '"password" is required',
       path: [Array],
       type: 'any.required',
       context: [Object] } ],
  _object:
   { password: undefined,
     cookie: 'GG-auth',
     isSecure: false,
     clearInvalid: true,
     ttl: 86400000,
     redirectTo: '/login',
     appendNext: true,
     redirectOnTry: false,
     isSameSite: 'Lax' },
  annotate: [Function] }

Поле пароля кажется неопределенным, вы уверены, что делаете правильный запрос на ваш маршрут?

...