尝试测试我的 hapijs 应用程序“注册”[1] 时: -- 缺失 --

问题描述 投票:0回答:1

我正在使用

hapijs
v17.2.3
。另外,我对 hapi 非常陌生。我正在尝试使用
Lab
一个简单的 Node.js 测试实用程序和
code
断言库来测试我的代码。

我的 test.js 文件是:

'use strict';

var path = require('path');
var dotEnvPath = path.resolve('./.env');
require('dotenv').config({ path: dotEnvPath });
const Code = require('code');
const Lab = require('lab');
const lab = exports.lab = Lab.script();
const describe = lab.describe;
const it = lab.it;
const expect = Code.expect;
const Joi = require('joi');
const Hapi = require('hapi');
const app = require('../app');
const server = new Hapi.Server();
const getServer = async () => {
    const server = new Hapi.Server();
    // server.connection();
    return server.register(app)
        .then(() => server);
};

lab.experiment('signup testing in "/signup"', () => {

    lab.test('Return true if the user can successfully signup', (done, flags) => {
        const signUpData = {
            method: 'POST',
            url: '/signup',
            payload: {
                name: 'vulcan',
                password: 'vulcan@123',
                email: '[email protected]',
                username: 'vulcan123',
                dob: '12-08-1994'
            }
        };

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

                flags.note(`demo test note`);

                if (response) {
                    console.log(response.statusCode);
                    Code.expect(response.statusCode).to.equal(201);
                    Code.expect(payload).to.contain(['name', 'password', 'email', 'username', 'dob']);

                }
                done();
            });
    });

});

lab.experiment('1) login test ', () => {
    lab.test('login has successfully done', (done) => {
        const loginData = {
            method: 'POST',
            url: '/login',
            payload: {
                email: 'wrong email',
                login_password: 'wrong password',
            }
        };
        getServer()
            .then((server) => {
                server.inject(loginData)
            })
            .then((response) => {
                Code.expect(response.statusCode).to.equal(200);
                done();
            });
    });
});

我的测试命令是:lab --assert code --coverage -t 100

我的注册控制器是:

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) => {
            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: request.payload.password,
                email: request.payload.email,
                username: request.payload.username.toLowerCase(),
                referralName: request.payload.username + '@gg',
                emailConfirmationToken: uuidv1(),
                dob: request.payload.dob,
                tnc: true
            };
            let data = await signupHelper.signUpUser(user, request);
            if (data.statusCode === 201) {

                if (request.payload.referredBy) {
                    let configureReferral = await signupHelper.configureReferral(request.payload.referredBy, data.userId);
                    if (configureReferral.statusCode === 200) {
                        request.yar.flash('success', 'Account created, Please Login');
                        return h.redirect('/login');
                    }
                }
                request.yar.flash('success', 'Account created, Please Login');
                return h.redirect('/login');
            } else {
                request.yar.flash('error', data.message);
                return h.redirect('/signup');
            }
        } catch (error) {
            logger.error(error);

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

我的登录控件:

exports.login = {
    description: 'Post to the login page',
    notes: 'Accepts two paramters email and password which got validation',
    tags: ['api'],
    auth: {
        mode: 'try',
        strategy: 'session'
    },
    plugins: {
        crumb: {
            key: 'crumb',
            source: 'payload',
        },
        'hapi-auth-cookie': {
            redirectTo: false
        }
    },
    validate: {
        payload: {
            email: Joi.string().min(3).email().required(),
            login_password: Joi.string().min(4).required()
        },
        failAction: (request, h, error) => {
            request.yar.flash('error', error.details[0].message.replace(/['"]+/g, ''));
            return h.redirect('/login').takeover();
        }
    },
    handler: async (request, h) => {
        try {
            const next = request.query.next ? request.query.next : '/dashboard';

            if (request.auth.isAuthenticated) {
                return h.redirect(next);
            }
            let resultData = await loginHelper.findByCredentials(request.payload.email, request.payload.login_password);
            if (resultData.statusCode === 200) {
                request.cookieAuth.set(resultData.user);
                return h.redirect(next);
            } else {
                request.yar.flash('error', resultData.message);
                return h.redirect('/login');
            }
        } catch (error) {
            logger.error(error);
            request.yar.flash('error', error.message);
            return h.redirect('/login');
        }
    }
};

这是我运行测试时的错误:

Socket server start initiated
Socket server started
Server started at https://127.0.0.1:8000
signup testing in "/signup"
  ✔ 1) Return true if the user can successfully signup (3615 ms)
1) login test
  ✖ 2) login has successfully done
(node:9708) UnhandledPromiseRejectionWarning: AssertionError [ERR_ASSERTION]: Invalid plugin options {
  "plugin": {
    "sock": {
      "init": function (server, options) {\n
..........
..........
},
      "register" [1]: -- missing --
      }
    }

    [1] "register" is required
        at new AssertionError (internal/errors.js:102:11)
        at Object.exports.assert (/home/jeslin/projects/hapi/gamergully/node_modules/hapi/node_modules/hoek/lib/index.js:517:11)
        at Object.exports.apply (/home/jeslin/projects/hapi/gamergully/node_modules/hapi/lib/config.js:22:10)
        at internals.Server.register (/home/jeslin/projects/hapi/gamergully/node_modules/hapi/lib/server.js:410:31)
        at getServer (/home/jeslin/projects/hapi/gamergully/test/tests-signup.js:23:19)
        at lab.test (/home/jeslin/projects/hapi/gamergully/test/tests-signup.js:115:9)
        at Immediate.setImmediate [as _onImmediate] (/home/jeslin/projects/hapi/gamergully/node_modules/lab/lib/runner.js:628:31)
        at runCallback (timers.js:810:20)
        at tryOnImmediate (timers.js:768:5)
        at processImmediate [as _immediateCallback] (timers.js:745:5)
    (node:8764) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 6)
    (node:8764) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
    Mongo Database connected

当我只运行一个测试用例时,它不会返回任何错误。如果我跑得更多 此错误显示的不止一个

我已通过以下this链接完成此操作

node.js unit-testing hapi.js
1个回答
0
投票

这可能与您的服务器实例创建有关。在一项测试中,您尝试创建多个具有相同配置的服务器实例。我想这可能就是问题所在。当我创建测试时,我使用 lab.before 和 lab.beforeEach 方法来创建实例。

这是我的一个项目中的一个真实测试用例。

const Lab = require('lab');
const lab = exports.lab = Lab.script();
const describe = lab.describe;
const it = lab.it;
const before = lab.before;
const after = lab.after;
const expect = require('code').expect;
// ..... other stufff

describe('Test Routes', () => {

    let server;

    before(async () => {
        server = new Hapi.Server();    
        await server.register(app)                        
    });


    after(async () => {        
        await server.stop();        
    });

    it('It should obtain valid response', async () => {
        const qs = querystring.stringify(queryParams);
        const res = await server.inject({
            url: `/s?${qs}`,
            method: 'get',
            headers: {
                "Cookie": "user=aighaeshaighaPopaGoochee8ahlei8x"
            }
        });
        expect(res.statusCode).to.equal(200);
        expect(res.result.userid).to.exist();
        expect(res.result.status).to.equal(true);


        // handle play action
        const res2 = await server.inject({
            url: `/b?id=${res.result.userid}`,
            method: 'get'
        });
        expect(res2.statusCode).to.equal(200);
        expect(res2.result.status).to.equal(true);
    });

    //
    it('It should reject invalid request', async () => {
        const res = await server.inject({
            url: `/a?a=b&id=iChah3Ahgaaj2eiHieVeem6uw2xaiD5g`,
            method: 'get'
        });
        expect(res.statusCode).to.equal(200);
        expect(res.result.status).to.equal(false);
        expect(res.result.message).to.equal("Invalid information");
    });

    // ... goes on
});

只需注意

before
after
来电即可。我只创建一个服务器实例,然后将其与我的测试用例一起使用,或者使用 beforeEach 和 afterEach 来隔离您的实例,这是您的选择。

© www.soinside.com 2019 - 2024. All rights reserved.