摩卡咖啡/express/supertest:&x27;错误:多次调用done()';

摩卡咖啡/express/supertest:&x27;错误:多次调用done()';,express,tdd,mocha.js,supertest,superagent,Express,Tdd,Mocha.js,Supertest,Superagent,我正在尝试用摩卡和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) { r

我正在尝试用摩卡和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();
        }
    });
});
My 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
收集路由器 得到/ ◦ 应该重定向到登录屏幕:GET/302221ms-40b 1) 应该重定向到登录屏幕 2) 应该重定向到登录屏幕 8次通过(281毫秒) 2失败 1) 收集路由器获取/应重定向到登录屏幕: 错误:多次调用done() 多次(development/git/ivorytower/node_modules/mocha/lib/runnable.js:175:31) 完成时(/development/git/ivorytower/node_modules/mocha/lib/runnable.js:181:26) 在development/git/ivorytower/node_modules/mocha/lib/runnable.js:197:9 在development/git/ivorytower/test/routes.js:15:4 在Test.assert(development/git/ivorytower/node_modules/supertest/lib/Test.js:190:3) 在development/git/ivorytower/node_modules/supertest/lib/test.js:119:10 在Test.Request.callback(development/git/ivorytower/node_modules/supertest/node_modules/superagent/lib/node/index.js:573:30) 在测试中。 以及express使用的测试套件: 我在这里不知所措。
谢谢

问题是我的路由器代码:

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块中的返回)修复了该问题。

好吧,我已经解决了。。。我忘记在我的路由器代码中添加一个返回,所以我实际上是在同一个响应对象上调用重定向和渲染。难怪出现了解析错误。