【问题标题】:Hapi Lab - how do I have shared state between lab experimentsHapi Lab - 我如何在实验室实验之间共享状态
【发布时间】:2015-10-26 17:46:27
【问题描述】:

所以我组成了用户域 我已经完成了我认为不错的套件 测试是这样的:

var Code = require('code');
var Lab = require('lab');
var lab = exports.lab = Lab.script();
var server = require('../../');
var Jwt = require('jsonwebtoken');
var Nconf = require('nconf');
var apiConfig =  Nconf.get('api');

lab.experiment('Users', function () {

    var userId, payload, decoded, token;

    lab.test('create joi required', function (done) {

        var options = {
            method: 'POST',
            url: '/api/users',
            payload: {
                lastname: 'Bedini',
                username: 'whisher',
                email: 'me@ilwebdifabio.it',
                password: 'mysecret'
            }
        };

        server.inject(options, function(response) {
            var result = response.result;
            Code.expect(response.statusCode).to.equal(422);
            Code.expect(result.message).to.equal('child "firstname" fails because ["firstname" is required]');
            done();
        });

    });

    lab.test('create', function (done) {

        var options = {
            method: 'POST',
            url: '/api/users',
            payload: {
                firstname: 'Fabio',
                lastname: 'Bedini',
                username: 'whisher',
                email: 'me@ilwebdifabio.it',
                password: 'mysecret'
            }
        };

        server.inject(options, function(response) {

            token = response.result.token;
            payload = options.payload;
            Code.expect(response.statusCode).to.equal(201);
            try {
                decoded = Jwt.verify(token, apiConfig.secret);
            }
            catch(err) {
            }
            console.log(decoded.scope);
            Code.expect(decoded.username).to.equal(payload.username);
            Code.expect(decoded.scope).to.be.an.array();
            userId = decoded.jti;
            done();
        });

    });

    lab.test('create sequelize unique', function (done) {

        var options = {
            method: 'POST',
            url: '/api/users',
            payload: {
                firstname: 'Fabio',
                lastname: 'Bedini',
                username: 'whisher',
                email: 'me@ilwebdifabio.it',
                password: 'mysecret'
            }
        };

        server.inject(options, function(response) {
            var result = response.result;
            Code.expect(result.message).to.equal('username must be unique');
            Code.expect(response.statusCode).to.equal(422);
            done();
        });

    });

    lab.test('update at least one required', function (done) {

        var options = {
            method: 'PUT',
            headers:{'Authorization' : 'Bearer ' + token},
            url: '/api/users/'+userId
        };

        server.inject(options, function(response) {
            var result = response.result;
            Code.expect(response.statusCode).to.equal(422);
            done();
        });

    });

    lab.test('update no password', function (done) {

        var options = {
            method: 'PUT',
            headers:{'Authorization' : 'Bearer ' + token},
            url: '/api/users/'+userId,
            payload: {
                password: 'mysecret_update'
            }
        };

        server.inject(options, function(response) {
            var result = response.result;
            Code.expect(response.statusCode).to.equal(422);
            done();
        });

    });

    lab.test('update not owner', function (done) {

        var options = {
            method: 'PUT',
            headers:{'Authorization' : 'Bearer ' + token},
            url: '/api/users/'+userId +1,
            payload: {
                firstname: 'Fabio_update'
            }
        };

        server.inject(options, function(response) {
            Code.expect(response.statusCode).to.equal(403);
            done();
        });

    });

    lab.test('update', function (done) {

        var updatevalue = Math.random().toString(36).slice(2);
        var options = {
            method: 'PUT',
            headers:{'Authorization' : 'Bearer ' + token},
            url: '/api/users/'+userId,
            payload: {
                firstname: 'Fabio_'+updatevalue,
                lastname: 'Bedini_'+updatevalue,
                username: 'whisher_'+updatevalue,
                email: 'me_'+updatevalue+'@ilwebdifabio.it'
            }
        };

        server.inject(options, function(response) {
            var result = response.result;
            Code.expect(response.statusCode).to.equal(200);
            Code.expect(result).to.equal(1);
            done();
        });

    });

    lab.test('findById not owner', function (done) {

        var options = {
            method: 'GET',
            headers:{'Authorization' : 'Bearer ' + token},
            url: '/api/users/'+userId +1,
        };

        server.inject(options, function(response) {
            Code.expect(response.statusCode).to.equal(403);
            done();
        });

    });

     lab.test('findById', function (done) {

        var options = {
            method: 'GET',
            headers:{'Authorization' : 'Bearer ' + token},
            url: '/api/users/'+userId
        };

        server.inject(options, function(response) {
            var result = response.result;
            Code.expect(response.statusCode).to.equal(200);
            Code.expect(result).to.be.instanceof(Object);
            Code.expect(Object.keys(result)).to.have.length(8);
            done();
        });

    });

    lab.test('destroy not owner', function (done) {

        var options = {
            method: 'DELETE',
            headers:{'Authorization' : 'Bearer ' + token},
            url: '/api/users/'+userId+1
        };

        server.inject(options, function(response) {
            Code.expect(response.statusCode).to.equal(403);
            done();
        });

    });

     lab.test('destroy', function (done) {

        var options = {
            method: 'DELETE',
            headers:{'Authorization' : 'Bearer ' + token},
            url: '/api/users/'+userId
        };

        server.inject(options, function(response) {
            var result = response.result;
            Code.expect(response.statusCode).to.equal(200);
            Code.expect(result).to.equal(1);
            done();
        });

    });

});

现在我也组成了产品域 是一些路由需要访问令牌。

如何使用“全局”测试产品域

var userId, payload, decoded, token;

或者在这种情况下如何转弯?

更新

@Matt Harrison 回答后

var getToken = function(){
    var user = {id:1,username:'abcdefghijklmnopqrstuvwxyz'};
    var token = JwtUtil.getUserToken(user).token;
    return token;
}
lab.experiment('Product', function () {



    lab.test('create', function (done) {
        var token = getToken();
        console.log(token);
        var options = {
            method: 'POST',
             headers:{'Authorization' : 'Bearer ' + token},
            url: '/api/products',
            payload: {
                title: 'myproduct'
            }
        };

        server.inject(options, function(response) {
            var result = response.result;
            console.log(result);
            Code.expect(response.statusCode).to.equal(200);
           // Code.expect(result.message).to.equal('child "firstname" fails because ["firstname" is required]');
            done();
        });

    });


});

它工作正常我还有一个问题 与

约束 products_ibfk_1 外键 (userId) 引用 users (id) ON UPDATE CASCADE) 堆栈:错误:ER_NO_REFERENCED_ROW

【问题讨论】:

    标签: hapijs lab


    【解决方案1】:

    不确定我是否正确理解了您的问题,但我认为您在问:

    如何在实验室实验之间共享状态?

    简单的答案是将var userId, payload, decoded, token; 移动到上层“全局”范围,以便可以在任何地方访问它们。

    但是我的建议是不要这样做。您的测试用例应该彼此独立。您应该能够添加测试、重新排序和删除它们,而不会影响其他测试用例。否则,您正在为自己制造维护噩梦。

    如果您在多个测试用例中需要一个资源,只需为每个测试创建一个新资源:

    lab.test('test the thing', function (done) {
    
        var token = getToken();
        expect(token).to.equal(...);
    });
    
    lab.test('test the other thing', function (done) {
    
        var token = getToken();
        expect(token).to.equal(...);
    });
    

    如果您需要更改资源然后进行测试,那就是单个测试用例:

    lab.test('change something and then test it', function (done) {
    
        var token = getToken();
        token.prop = 'value';
        expect(token.prop).to.equal('value');
    });
    

    【讨论】:

    • 感谢您的观点和标题的线索:)。我认为困难的是设置 getToken() 并在测试之间共享它。你能给我一个例子吗?顺便说一句,在我的 package.json 我有“test”:“lab -c ./test/e2e”,加载文件的顺序是什么?我应该喜欢带有所有“全局”的 myroottest 和带有所有测试的其他 mysubroottest 吗?
    • 我已经更新了我的帖子关于如何解决 CONSTRAINT 问题的任何想法?
    • @Whisher 你的另一个问题是 MySQL;与hapi无关。你最好提出一个新问题。
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多