我的猫鼬测试失败,除非我反复检查我保存在数据库中的数据

Posted

技术标签:

【中文标题】我的猫鼬测试失败,除非我反复检查我保存在数据库中的数据【英文标题】:My mongoose test fails unless I repeatedly check the data I've saved in the database 【发布时间】:2014-06-20 22:03:45 【问题描述】:

我在使用 mocha 为我的对象编写测试时遇到问题。该代码似乎在实践中有效,但在我的测试期间,数据库更新发生的时间比预期的要晚。在测试设置期间,我将一些记录插入到集合中。在拆解中,我清除了集合。当我搜索已知记录时,我得到零结果,除非我递归调用回调函数(如下面的代码所示)。

一切都是异步写入的。 setup 函数返回所有记录。不知何故,数据似乎没有足够快地刷新。任何人都可以建议我是否使用递归循环正确处理这个问题?

var myclass = require('myclass')
var mongoose = require('mongoose');
var should = require('should');
mongoose.connect('mongodb://localhost/myDbTests');
mongoose.connection.on('error', console.error.bind(console, 'connection error:'));

describe('Test my collection.', function () 
    beforeEach('load dummy data into the database', function (done) 
        myclass.load_data(dummyData, function (count) 
            count.should.be.greaterThan(5);
            done();
        );
    );
    afterEach('clear the database', function (done) 
        myclass.model.remove(, function() 
            done();
        );
    );

    it('check that a known record exists database', function (done) 
        var keep_checking = function (td) 
            if (!td) 
                myclass.get_record('MYRECORD', keep_checking);
             else 
                td.should.have.property('category', 'someCategory');
                done();
            
        
        keep_checking(0);
    );

);

我的load_data 是:

var _load_data = function (data, callback) 
    data.forEach(function (d) 
        var rec = new _model(d);
        rec.save(function(err, res) 
            if (err) return console.error(err);
        );
    );
    callback(data.length);
;

【问题讨论】:

【参考方案1】:

您应该等到数据库连接打开才能运行您的测试。 我在测试中使用before 钩子实现了这一点,该钩子在任何测试之前运行(以及在beforeEach 之前):

before(function(done) 
  mongoose.connection.once('open', done);

这将阻止在数据库连接打开之前运行任何东西。

【讨论】:

真的很抱歉。我认为这解决了它,但事实证明我很快就与之交谈。我在没有删除循环的情况下进行了检查,现在错误又回来了。似乎两次都没有找到记录,然后在第三次尝试时它发现从数据库中获取了一些东西。不知何故,我在写入完成之前正在阅读,但我看不到任何会导致这种情况的异步代码。很抱歉造成混乱,但我还是采纳了您的建议,因为这是一种很好的做法。 我查看了我的代码并意识到我没有提供导致问题的功能:(。再次感谢您的帮助! 哈,没问题,我本来打算这么建议的,但这似乎是一个迂腐的问题。下次我会做的:)【参考方案2】:

我没有正确加载数据。 Mongoose 不允许插入多条记录,所以我使用了一个同步的 .forEach 循环来保存每个对象。一种更好的方法,因此我的解决方案如下:

var _load_data = function (data, callback) 
    var total = data.length,
        count = 0;

    function saveAll() 
        var doc = data[count];
        var rec = new _model(doc);
        rec.save(function(err, res) 
            if (err) 
                throw err;
            
            if (count !== total) 
                count += 1;
                saveAll();
             else 
                callback(count);
            
        );
    
    saveAll();
;

【讨论】:

您实际上应该使用异步库而不是包含所有同步代码。即使是 Promises 库也会大大改进这段代码。

以上是关于我的猫鼬测试失败,除非我反复检查我保存在数据库中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的猫鼬模式中引用多个模式?

如何填充新创建的猫鼬文档?

多边形内的猫鼬地理查询

如何使用节点异步来获取我的猫鼬电话?

寻找访问字符串的猫鼬数组

只显示最近的猫鼬时间戳?