2013-06-30 34 views
1

我試圖用摩卡和超級通道測試我的路線。不幸的是,我似乎無法測試我的重定向。mocha/express/supertest:'錯誤:完成()多次調用'

下面是相關代碼

var should = require('should'); 
var request = require('supertest'); 
var app = require('../app'); 
describe('GET /',function() { 
    it('should redirect to the login screen',function(done) { 
     request(app) 
      .get('/') 
    .end(function(err,res) { 
     if(err) { 
      console.log("ERR: "+err); 
      done(err); 
     } else { 
      console.log("RES:\n",res); 
      res.headers.should.have.property('location','/login'); 
      done(); 
     } 
    }); 
}); 

我app.js有這樣的:

app.get('/', routes.index);

我routes.index看起來是這樣的:

exports.index = function(req, res){ 
    if(!req.body.username) { 
     res.redirect('/login'); 
    } 
    res.render('index', { title: 'Express' }); 
}; 

和我的登錄頁面是:

exports.login = function(req,res) { 
    res.render('login',{title: 'Please login'}); 
}; 

我收到以下錯誤,當我運行測試,這讓我覺得它的實際運行不止一次:

collection router 
    GET/
     ◦ should redirect to the login screen: GET/302 221ms - 40b 
     1) should redirect to the login screen 
     2) should redirect to the login screen 


    8 passing (281 ms) 
    2 failing 

    1) collection router GET/should redirect to the login screen: 
    Error: done() called multiple times 
     at multiple (development/git/ivorytower/node_modules/mocha/lib/runnable.js:175:31) 
     at done (/development/git/ivorytower/node_modules/mocha/lib/runnable.js:181:26) 
     at development/git/ivorytower/node_modules/mocha/lib/runnable.js:197:9 
     at development/git/ivorytower/test/routes.js:15:4 
     at Test.assert (development/git/ivorytower/node_modules/supertest/lib/test.js:190:3) 
     at development/git/ivorytower/node_modules/supertest/lib/test.js:119:10 
     at Test.Request.callback (development/git/ivorytower/node_modules/supertest/node_modules/superagent/lib/node/index.js:573:30) 
     at Test.<anonymous> (development/git/ivorytower/node_modules/supertest/node_modules/superagent/lib/node/index.js:133:10) 
     at Test.EventEmitter.emit (events.js:95:17) 
     at IncomingMessage.<anonymous> (development/git/ivorytower/node_modules/supertest/node_modules/superagent/lib/node/index.js:703:12) 
     at IncomingMessage.EventEmitter.emit (events.js:117:20) 
     at _stream_readable.js:910:16 
     at process._tickCallback (node.js:415:13) 

    2) collection router GET/should redirect to the login screen: 
    Error: done() called multiple times 
     at multiple (development/git/ivorytower/node_modules/mocha/lib/runnable.js:175:31) 
     at done (development/git/ivorytower/node_modules/mocha/lib/runnable.js:181:26) 
     at development/git/ivorytower/node_modules/mocha/lib/runnable.js:197:9 
     at development/git/ivorytower/test/routes.js:15:4 
     at Test.assert (development/git/ivorytower/node_modules/supertest/lib/test.js:190:3) 
     at development/git/ivorytower/node_modules/supertest/lib/test.js:119:10 
     at Test.Request.callback (development/git/ivorytower/node_modules/supertest/node_modules/superagent/lib/node/index.js:573:30) 
     at Test.<anonymous> (development/git/ivorytower/node_modules/supertest/node_modules/superagent/lib/node/index.js:133:10) 
     at Test.EventEmitter.emit (events.js:95:17) 
     at IncomingMessage.<anonymous> (development/git/ivorytower/node_modules/supertest/node_modules/superagent/lib/node/index.js:703:12) 
     at IncomingMessage.EventEmitter.emit (events.js:117:20) 
     at _stream_readable.js:910:16 
     at process._tickCallback (node.js:415:13) 



npm ERR! weird error 2 
npm ERR! not ok code 0 

我已經看了看,發現了一些可能相關的錯誤,但他們幾乎一歲,我遵循建議的解決方法無濟於事: https://github.com/visionmedia/supertest/issues/11#issuecomment-20251424 和快遞使用的測試套件: https://github.com/visionmedia/express/blob/master/test/res.redirect.js 我在這裏虧本。 感謝

+0

嗯,我想通了......我忘了在我的路由器代碼中添加一個返回值,所以我實際上調用了重定向和同一響應對象上的呈現。難怪有一個解析錯誤。 –

回答

0

的問題是我的路由器代碼:

exports.index = function(req, res){ 
    if(!req.body.username) { 
     res.redirect('/login'); 
    } 
    res.render('index', { title: 'Express' }); 
}; 

應該已經

exports.index = function(req, res){ 
    if(!req.body.username) { 
     res.redirect('/login'); 
    } else { 
     res.render('index', { title: 'Express' }); 
    } 
}; 

所以反應也越來越寫入一個重定向,然後隨即爲具有渲染到模板它(如果我正確理解它)。 if/then/else塊(或if塊中的返回值)解決了該問題。