我已经How do I get an asynchronous result back with node unit and mongoose?并且非常轻微地修改它以更简单地显示我的失败。
var mongoose = require('mongoose');
var db;
module.exports = {
setUp: function(callback) {
try {
//db.connection.on('open', function() {
mongoose.connection.on('open', function() {
console.log('Opened connection');
callback();
});
db = mongoose.connect('mongodb://localhost/test_1');
console.log('Started connection, waiting for it to open');
} catch (err) {
console.log('Setting up failed:', err.message);
test.done();
callback(err);
}
},
tearDown: function(callback) {
console.log('In tearDown');
try {
console.log('Closing connection');
db.disconnect();
callback();
} catch (err) {
console.log('Tearing down failed:', err.message);
test.done();
callback(err);
}
},
test1: function(test) {
test.ifError(null);
test.done();
},
test2: function(test) {
test.ifError(null);
test.done();
}
};
使用nodeunit运行时,我得到以下内容:
stam2_test.js
Started connection, waiting for it to open
Opened connection
In tearDown
Closing connection
✔ test1
Started connection, waiting for it to open
Opened connection
FAILURES: Undone tests (or their setups/teardowns):
- test2
To fix this, make sure all tests call test.done()
更多信息: 如果在setUp / tearDown中我没有用户mongo而只是一个测试代码,比如增加一个计数器,它一切正常。 如果我只有一个测试,那么一切正常。 添加另一个测试并在设置中使用mongo一直失败,所以我猜我在设置中做错了。
提前谢谢。
答案 0 :(得分:0)
失败的原因似乎是mongoose.connection.on('open',...)
中的事件订阅仍然绑定到test1的回调,即使在断开连接并连接test2之后也是如此。对前一个回调的额外调用是导致问题的那个。
完成后,您应确保以某种方式删除订阅。由于mongoose连接基于nodejs EventEmitter,因此一个简单的解决方案可能是替换该调用
mongoose.connection.on('open'...)
同
mongoose.connection.once('open'...)
但您也可以根据需要使用常规的add / removeListener()。
另一方面,在单元测试的每个测试中,似乎不需要连接和断开连接。您可以通过像require('db_connect_test')
中那样需要连接到测试数据库的模块来连接一次,模块db_connect_test应该只调用mongoose.connect(...)
并且所有测试都将使用相同的连接(或池作为mongoose创造)。
有一个好的!