nodeunit无法退出异步测试

时间:2013-08-01 11:41:08

标签: node.js unit-testing integration-testing nodeunit

每当我在IDE或控制台中运行nodeunit测试时,它运行良好但无法退出。请帮帮我!

var store = require('../lib/db');
var list = require('../source/models/mock_deals');
var logger = require('../lib/logging').logger;

exports.setUp = function(done){
    logger.info('start test...');
    done();
};
exports.tearDown = function(done){
    logger.info('end test...');
    done();
};

exports.testInsertDeal = function(test){
    var length = list.length;
    test.equals(length, 2);
    store.mongodb.open(function(err,db){
        if(err){
            logger.error(err);
            return;
        }
        logger.info("mongodb is connected!");

        db.collection('deals',function(err,collection){
            for(var i=0; i<length; i++){
                var item = list[i];
                collection.insert(item, function(err, result){
                    if(err){
                        logger.error('Fail to insert document deal [' + item.id + ']');
                        return;
                    }
                    logger.info( 'index ' + i + ' : ' +JSON.stringify(item) );
                });
            }
        });
        test.expect(1);
    });
    test.done();
};

2 个答案:

答案 0 :(得分:2)

我改为使用 mongoose 而不是 mongodb 。测试仍无法自动退出。

但是当我在 nodeunit 测试中以test.tearDown方法断开mongoose时。测试存在正确。

在下面添加测试:

exports.tearDown = function(done){
    mongoose.disconnect(function(err){
        if(err) {
            logger.error(err);
            return;
        }
        logger.info('mongoose is disconnected');
    });
    done();
};

此外,如果我使用 log4js 登录我的测试并使用reloadSecs: 500配置 log4js ,则测试也不会存在。将reloadSecs设置为0后,测试就很好了。所以我们需要使用选项reloadSecs: 0

配置logging.json

总结一下:在完成所有测试方法后,我们需要确保没有工作部件。然后测试将正确存在。

答案 1 :(得分:0)

如果您知道程序何时退出,只需使用以下代码行退出:

process.exit(0);

其中0是程序的返回码。

现在这并不能解决问题。可能还有一个回叫仍在等待,或者一个仍处于活动状态的连接,保持您的程序正常运行,而这在您在此处发布的代码中未显示。如果您不想找到它,只需使用process.exit。如果你真的想找到它,你将不得不挖掘更多。我从来没有使用过nodeunit但是我已经使用了其他节点库,这些节点库在内部工作中留下了东西,使程序不会退出。在这些情况下,我通常不想涉及其他人的源代码,以了解发生了什么,所以我只是做前面提到的process.exit调用。

至少应该给你一个选择。