首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mocha/express/supertest:'Error: done()多次调用‘

mocha/express/supertest:'Error: done()多次调用‘
EN

Stack Overflow用户
提问于 2013-07-01 02:58:16
回答 1查看 3K关注 0票数 1

我正在尝试使用mocha和supertest在express中测试我的路由。不幸的是,我似乎无法测试我的重定向。

下面是相关的代码

代码语言:javascript
复制
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看起来像这样:

代码语言:javascript
复制
exports.index = function(req, res){
    if(!req.body.username) {
        res.redirect('/login');
    }
    res.render('index', { title: 'Express' });
};

我的登录页面是:

代码语言:javascript
复制
exports.login = function(req,res) {
    res.render('login',{title: 'Please login'});
};

当我运行测试时,我得到以下错误,这让我认为它实际上运行了不止一次:

代码语言:javascript
复制
  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

我寻找并发现了一些可能相关的bug,但它们已经有将近一年的历史了,我正在遵循建议的变通方法,但都无济于事:https://github.com/visionmedia/supertest/issues/11#issuecomment-20251424和express:https://github.com/visionmedia/express/blob/master/test/res.redirect.js使用的测试套件我在这里感到困惑。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-01 23:41:01

问题出在我的路由器代码上:

代码语言:javascript
复制
exports.index = function(req, res){
    if(!req.body.username) {
        res.redirect('/login');
    }
    res.render('index', { title: 'Express' });
};

应该是

代码语言:javascript
复制
exports.index = function(req, res){
    if(!req.body.username) {
        res.redirect('/login');
    } else {
        res.render('index', { title: 'Express' });
    }
};

因此,响应是向它写入一个重定向,然后立即向它呈现一个模板(如果我理解正确的话)。if/then/else块(或if块中的return )修复了该问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17393791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档