2016-11-16 56 views
1

我嘗試使用supertest和nock在我的Express應用程序中測試中間件功能,但遇到問題,我設置的路由已由較早的中間件檢查以確保會話屬性存在對傳入的req對象。在Express中測試中間件時提供會話

我需要以某種方式模擬運行測試之前的會話對象,但我不確定如何處理這個問題。首先讓我分享一些代碼:

router.js

app.use('/api', helpers.hasAccessToken, require('./routes.js')); 

routes.js

router.route('/*') 
    .get(routesController.fetch) 

helpers.js

module.exports.hasAccessToken = function(req, res, next) { 
    if(req.session.accessToken){ 
    next(); 
    } else { 
    res.status(401).send('LOGIN_SESSION_ENDED'); 
    } 
}; 

routesController.js

module.exports.fetch = function(req, res) { 
    var options = helpers.buildAPIRequestOptions(req); 
    request(options, function(err, response, body){ 
    res.status(response.statusCode).send(body); 
    }); 
}; 

routesController.spec.js

var app = require('./index.js'), 
    request = require('supertest')(app), 
    expect = require('chai').expect, 
    nock = require('nock'); 


describe('GET requests', function(){ 
    beforeEach(function(){ 
    nock('https://10.105.195.12:8243') 
     .get('/v1/schemes') 
     .reply(200, {foo:'bar'}); 
    }); 
    it('should return a 200 HTTP status code', function(done){ 
    request 
     .get('/api/schemes') 
     .end(function(err, res){ 
     expect(res.status).to.equal(200); 
     done(); 
     }); 
    }); 
}); 

res.status值是401我使用快遞會話,但我想,如果我的測試失敗有我可以通過某種方式獲取測試套件中的req.session對象,並在運行任何測試之前設置accessToken屬性的值。

任何人都可以提供任何建議\想法嗎?

感謝

回答

2

讓我們創造一些存根與價值req.session對象,它是我們的控制之下。

var app = require('./index.js'), 
    request = require('supertest'), // no longer app here as we want to call parentApp 
    expect = require('chai').expect, 
    nock = require('nock'); 

describe('GET requests', function(){ 
    var parentApp; 

    beforeEach(function(){ 
    parentApp = express(); 
    parentApp.use(function(req, res, next) { // lets stub session middleware 
     req.session = {}; 
     next(); 
    }) 
    parentApp.get('/api', function(req, res, next) { 
     req.session.accessToken = true; // and provide some accessToken value 
     next(); 
    }) 
    parentApp.use(app); 
    nock('https://10.105.195.12:8243') 
     .get('/v1/schemes') 
     .reply(200, {foo:'bar'}); 
    }); 

    it('should return a 200 HTTP status code', function(done){ 
    request(parentApp) // we are testing now app through parentApp and stubbed middleware 
     .get('/api/schemes') 
     .end(function(err, res){ 
     expect(res.status).to.equal(200); 
     done(); 
     }); 
    }); 
});