2012-06-08 31 views
2

我想为异步数据库调用编写单元测试。我正在使用NodeJSORMnomnom安装的包作为orm db访问和nodeunit进行单元测试。 但它挂在这个简单的测试:Nodeunit测试挂起为异步数据库调用ORMnomnom

下面是测试代码\ test1.js

modelsdb = require('../model/model_db') 

exports['test db'] = function (test) { 
    test.expect(1); 
    console.log('test db'); 
    modelsdb.MyTable.objects.all(function (err, data) { 
    test.ok(true, "this assertion should pass"); 
    test.done(); 
    console.log('test must finish here!'); 
    }); 
} 

exports.testSomething = function(test){ 
    console.log('testSomething'); 
    test.expect(1); 
    test.ok(true, "this assertion should pass"); 
    test.done(); 
}; 

当我运行这个测试的所有断言过去了,我看到我的消息在控制台:“测试数据库”“测试必须在这里完成!' 'testSomething'(意味着test.done()在回调函数内到达),但测试没有完成。我需要手动停止它,得到:'处理完成退出代码1'。如果我更改为test.ok(false,“”),所以我得到AssertionError但测试没有完成。如果我删除'测试数据库',只留下testSomething函数 - 测试按预期完成,所有断言都通过了。

我也试试testpilot这是基于nodeunit的包。 它给出

test1 
    FAIL : test db 
     an error occurred during test: 
     Error: timed out waiting for test 

有什么建议吗? 谢谢。

+0

重命名“测试数据库”的东西没有空格字符,它应该工作 – srquinn

+0

@jibsales,我试过没有空格,相同,所有测试仍然处于挂起状态。 – fresh

+0

尝试用setTimeout()替换异步数据库调用,以确保ORM不挂在连接上或其他背景中,以防止该过程正常退出。 – srquinn

回答

0

我遇到了与nodeunit和q/mongoose类似的问题 - 已经打开了一个bug。在拨打test.done()之后,我试图做好可怕的process.exit(0),但任何待处理的日志都可能没有被刷新,所以它并不理想。最后必须在超时模块中调用process.exit(0)

2

tearDown方法添加到您的出口关闭mongoose的连接池。只要它仍然打开,测试不会退出。

你不显示怎么你打开你的猫鼬连接,但这样的事情:

exports.tearDown = function (callback) { 
    mongoose.disconnect(callback); 
}; 
+1

更好:'mongoose.disconnect(callback);' –