我的猫鼬测试失败,除非我反复检查我保存在数据库中的数据
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 库也会大大改进这段代码。以上是关于我的猫鼬测试失败,除非我反复检查我保存在数据库中的数据的主要内容,如果未能解决你的问题,请参考以下文章