2013-06-30 35 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块中的返回值)解决了该问题。