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 中断言失败的主要内容,如果未能解决你的问题,请参考以下文章
GeoSpatial 查询在 mongo shell 中工作,但在 C# 驱动程序中没有过滤