0

每当我在 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();
};
4

2 回答 2

2

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

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

在您的测试中添加以下内容:

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

而且,如果我使用log4js登录我的测试并使用 配置log4jsreloadSecs: 500测试也将不存在。在我设置reloadSecs为 0 之后,测试存在良好。所以我们需要用选项配置logging.jsonreloadSecs: 0

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

于 2013-08-02T09:48:03.220 回答
0

如果您知道程序应该何时退出,您可以简单地使用以下代码行退出:

process.exit(0);

其中 0 是程序的返回码。

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

这至少应该给你一个选择。

于 2013-08-01T14:49:10.423 回答