简体   繁体   English

我的摩卡咖啡测验怎么了?

[英]What's wrong with my mocha test?

I have written this code in express.js and mongoose 我已经用express.js和mongoose编写了这段代码

routes.js 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 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;

When I execute this from the browser. 当我从浏览器执行此操作时。 I can see that it returns results correctly from my mongo db. 我可以看到它从我的mongo数据库正确返回了结果。

But when I write this mocha test case for the same code 但是,当我为相同的代码编写此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();
    });
});

The test case output is just 测试用例的输出只是

1 passing (18ms) 1次通过(18ms)

So I am very sure that it doesn't even go inside the end method and it doesn't print anything inside the end method. 因此,我非常确定它甚至不会进入end方法内部,并且不会在end方法内部打印任何内容。

I can see that the call goes to the server but it never establishes the connection with mongo. 我可以看到该调用转到了服务器,但它从未与mongo建立连接。 it just hangs as readyState of 2. 它只是作为2的readyState挂起。

So somehow when the test is executing via mocha... it never connects to mongo and is hung on connecting. 因此,以某种方式通过Mocha执行测试时...永远不会连接到mongo并挂在连接上。 but when the code is executed via npm start... everything works fine. 但是当通过npm start执行代码时...一切正常。

What is going wrong with mocha test case? 摩卡测试用例出了什么问题?

Your done() call needs to be made from within the request callback: 您的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();
        });
    });
});

As it is currently, you call done() before your request is finished. 就目前而言,您done()在请求完成之前调用done()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM