如何在用户使用护照登录的情况下测试帆.js控制器.js

How to test sail.js controller with user logged in with passport.js

本文关键字:js 情况下 测试 控制器 登录 用户      更新时间:2023-09-26

我尝试对我的 sail.js 控制器进行单元测试,该控制器需要用户登录。我目前的测试是:

var request = require('supertest'),   // I try to use 'superagent', this changes nothing
    user = request.agent;
describe('SomeController', function() {
    // login user first of all
    before(function(done) {
        user(sails.hooks.http.app)
            .post('/user/login')
            .send({username: 'hellocat', password: '123456789'})
            // request works well by itself, 
            // it does not return error and return normal response.
            .end(function (err, res) {
                // then I try to save cookies of logged in user to it agent
                user(sails.hooks.http.app).saveCookies(res);
                done();
            });
    });
    // let test something
    it('must return "ok" when user is logged in or "wtf" if opposite', function(done) {
        user(sails.hooks.http.app)
            .get('/user/me')
            .end(function(err, res) {
                console.log(res.body);
                // no need to expect something, user is not logged in (
                done();
            });
    });
});

钩子运行良好并且我的用户在请求结束时登录之前。但在测试中并非如此。在所有测试开始运行之前,我举起帆应用程序。不需要授权的类似测试效果很好。我想错误可能在于 cookie 保存或对如何使用超级测试代理的错误理解。我做错了什么?

好吧,我终于找到了我的错误。 request.agent函数不返回单例。因此,user(sails.hooks.http.app)的每次调用实际上是新代理和新用户。为了使这个测试片段工作,我应该做这样的事情

var request = require('supertest'),
    agent = request.agent;

并在描述部分呼叫代理一次:

describe('SomeController', function() {
    var user;
    before(function(done) {
        user = agent(sails.hooks.http.app);
        user
            .post('/user/login')
            // ...
    // ...