nodeunit中mongo失败的多个任务

时间:2013-08-20 04:17:20

标签: mongodb nodeunit

我已经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一直失败,所以我猜我在设置中做错了。

提前谢谢。

1 个答案:

答案 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创造)。

有一个好的!