【问题标题】:What's wrong with my mocha test?我的摩卡咖啡测试出了什么问题?
【发布时间】:2014-07-28 08:51:29
【问题描述】:

我已经在 express.js 和 mongoose 中编写了这段代码

routes.js

var mongoose = require('mongoose'),
    logger = require('../logger');

mongoose.connection.on('error', function(){
    logger.info('Mongoose connection error' + error);
});

exports.getitems = function(req, res) {
    mongoose.connect('mongodb://localhost/abhitest', {auto_reconnect: true, native_parser: true}, function(err){        
        if (err) logger.error("Error " + err);
    });
    var Schema = mongoose.Schema;
    var User = new Schema({
        username : {type: String, required: true},
        email : {type: String, required: true}
    }, {collection: 'User'});

    var UserModel = mongoose.model('User', User, 'User');   
    UserModel.find({}, function(err, users){
        if (!err) {
            logger.info('found ' + users);
            res.json(200, users);
        } else {
            logger.error(err);
            res.json(404, 'did not find anything');
        }
    });
};

app.js

var mongoose = require('mongoose'),
    express = require('express'),
    app = express(),
    routes = require('./routes'),
    http = require('http');

app.get('/', routes.getitems);
http.createServer(app).listen(3000);
module.exports = app;

当我从浏览器执行此操作时。我可以看到它从我的 mongo db 中正确返回结果。

但是当我为相同的代码编写这个 mocha 测试用例时

var app = require('../app'),
    request = require('supertest'),
    assert = require('assert'),
    _ = require('underscore');

describe('when the test runs', function() {
    it ('should insert 3 records in mongo db', function(done){
        request(app)
        .get('/')       
        .expect('Content-Type', /json/)
        .expect(200)
        .end(function(err, res){
            if (err) console.log(err);          
            else {
                console.log(res.text);
                var items = JSON.parse(res.text);
                for(var i = 0; i < items.length; i++) {
                    var item = items[i];
                    assert(_.has(item, 'username'));
                    assert(_.has(item, 'email'));
                    console.log(item.username);
                    console.log(item.email);
                }
            }
        });
        done();
    });
});

测试用例输出只是

1 次通过(18 毫秒)

所以我很确定它甚至不会进入 end 方法,也不会在 end 方法中打印任何内容。

我可以看到调用转到了服务器,但它从未与 mongo 建立连接。它只是挂起为 2 的 readyState。

所以当测试通过 mocha 执行时……它永远不会连接到 mongo 并且在连接时挂起。但是当代码通过 npm start 执行时……一切正常。

mocha 测试用例出了什么问题?

【问题讨论】:

  • 你为什么不尝试在更小的范围内重现这个问题呢?首先,它将帮助您自己理解(并且很可能会解决)这个问题。其次,这里 90% 的人只会查看您发布的代码长度并离开。那里有很多与问题完全无关的代码。这只是您帖子中的噪音。
  • 您在调用请求后立即调用 done(),mocha 会将其解释为成功完成的测试,您需要在 end 函数中调用 done()。

标签: node.js express mocha.js supertest


【解决方案1】:

您的done() 调用需要在请求回调中进行:

describe('when the test runs', function() {
    it ('should insert 3 records in mongo db', function(done){
        request(app)
        .get('/')       
        .expect('Content-Type', /json/)
        .expect(200)
        .end(function(err, res){
            if (err) console.log(err);          
            else {
                console.log(res.text);
                var items = JSON.parse(res.text);
                for(var i = 0; i < items.length; i++) {
                    var item = items[i];
                    assert(_.has(item, 'username'));
                    assert(_.has(item, 'email'));
                    console.log(item.username);
                    console.log(item.email);
                }
            }
            return done();
        });
    });
});

目前,您在请求完成之前致电done()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2019-03-07
    • 2015-04-18
    • 2015-12-28
    相关资源
    最近更新 更多