0

我已经采取了如何使用节点单元和猫鼬获得异步结果?并且非常轻微地修改它以更简单地显示我的失败。

var 猫鼬 = 要求('猫鼬');

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 始终失败,所以我想我在设置中做错了什么。

先感谢您。

4

1 回答 1

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 创建的池)运行。

祝你有个好的一天!

于 2013-08-21T05:02:32.910 回答