Mongo Shell 显示添加的文档,但在 Scalatest 中断言失败

Posted

技术标签:

【中文标题】Mongo Shell 显示添加的文档,但在 Scalatest 中断言失败【英文标题】:Mongo Shell Shows Docs Added, yet Assert Fails in Scalatest 【发布时间】:2013-10-07 01:52:30 【问题描述】:

使用 scalatest 和 Casbah,我创建了一个测试以将一堆文档加载到 Mongo 中,然后断言 collection.count() > 0

val collection = MongoConnection()(MY_DB)(MY_COLLECTION) 
collection.dropCollection // clear out any docs from previous test run

insert200DocumentsIntoMongo() // inserts 200 docs into the same DB and collection

assert(collection.size > 0) 

对于多个测试,scalatest 会抛出断言不正确的异常。

但是,在测试失败后,我可以在 Mongo shell 中清楚地看到,根据上面的“MY_DB”和“MY_COLLECTION”,有 200 个文档被添加到 Mongo 数据库的集合中。

>db.test.count()
200

我很困惑为什么这个断言失败,因为 Mongo shell 显示集合中有 200 个文档。

另外,我尝试使用 post 删除整个数据库,但断言仍然失败。

【问题讨论】:

【参考方案1】:

尝试更改 mongo 写入关注点:

collection.setWriteConcern(WriteConcern.FsyncSafe)

【讨论】:

谢谢,谢尔盖。因此,我的测试和生产写入问题 (WC) 可能会有所不同。因此,我是否应该使用配置值来指定要使用的 WC?通常的模式是什么? 我认为这取决于您的需求。通常在生产中阻塞进程并等待数据库操作是不好的。我建议从docs.mongodb.org/manual/core/write-concern 开始,并用你的具体案例进行实验(这是与 mongodb 相关的所有内容的一般建议)。 @Kevin,我将使用与生产中相同的 WC,并在断言之前的测试中添加 getLastError。 其实,经过进一步测试,我对这个答案提出了质疑。由于代码重构,我将 WriteConcern 设置在执行写入的 Object 服务中。根据配置,我设置了 WriteConcern。使用FsyncSafe 时,我的测试在检查集合大小时仍然失败。我认为这篇 SO 帖子表明fsync不一定 必须写入磁盘 - ***.com/questions/12262454/…。实际上,它可能会在 60 秒内写入 - docs.mongodb.org/manual/reference/command/fsync【参考方案2】:

有几个选项:

一个改变 mongo 写关注点的方法,正如 Sergey 指出的那样。

默认情况下,Mongo 异步写入,这意味着当您触发插入时,它不会等待数据被插入并继续前进。更改写入关注点将使您的测试工作,但如果您不在生产环境中使用此选项,则可能会掩盖问题,具体取决于您正在测试的内容。

另一种选择是在执行断言之前先等待,这可能会更棘手。

最后你可以使用 getLastError,它会阻止你的执行,直到最后一个命令被执行。

阅读更多here

【讨论】:

谢谢,维西纽斯。我使用了您推荐的方法 - 在生产代码中使用异步 WC,但在测试中使用 getLastError 我认为这是要走的路。我很高兴能帮上忙。

以上是关于Mongo Shell 显示添加的文档,但在 Scalatest 中断言失败的主要内容,如果未能解决你的问题,请参考以下文章

Mongo - 如果子文档数组中的对象具有值,则添加字段

GeoSpatial 查询在 mongo shell 中工作,但在 C# 驱动程序中没有过滤

GeoSpatial 查询在 mongo shell 中工作,但在 C# 驱动程序中没有过滤

如何在mongo shell中查看文档字段?

如何将子文档插入 mongo 集合?

如何将子文档插入 mongo 集合?