2013-04-10 111 views
15

我必须使用MongoDB商店来实现Python代码的nosetests。有没有任何python库允许我初始化模拟内存MongoDB服务器?使用模拟MongoDB服务器进行单元测试

我正在使用持续集成。所以,我希望我的测试独立于任何运行MongoDB的服务器。 有没有办法在内存中模拟mongoDM Server来独立于连接到Mongo服务器来测试代码?

在此先感谢!

回答

11

您可以尝试:https://github.com/vmalloc/mongomock,它旨在成为一个小型库,用于嘲笑pymongo集合对象以进行测试。

但是,我不确定只是运行mongodb的成本与确保某些嘲讽库功能完备相比是不可取的。

+7

如果能够得到一个关于mongoengine和mongomock如何在一起玩的很好的例子。 – badgley 2013-10-11 00:49:39

+0

确保您与3.0以后的版本具有良好的兼容性。我在升级服务器和驱动程序(pymongo)后立即尝试使用所有框架来嘲笑我的集合。 – 2016-04-04 18:24:11

4

我不了解Python,但我对C#也有类似的担忧。我决定在我的工作站上运行一个真实的Mongo实例,指向一个空目录。这不是很好,因为代码不是孤立的,而是快速简单。

只有数据访问层在测试期间实际调用Mongo。其余的可以依靠数据访问层的模拟。无论如何,当我真的想验证与Mongo的交互是正确的时,我并不觉得伪装了Mongo是值得的。

+4

+1我不明白想孤立地测试一切的愿望。你可以期望的最好的是它的行为像真实的东西。只是测试真实的东西。配置专用测试数据库。 – Leopd 2013-04-10 03:39:30

+3

这是一个有效的观点,但单独测试的一个原因是您可以更轻松地将其提供给其他人,以便他们也可以在其环境中进行测试。如果他们必须建立一个外部过程,那么这会变得更加繁重(尽管在这种情况下它可能是值得的)。 – 2013-06-12 16:42:59

+0

此外,如果测试旨在管道中运行,则无法确定是否安装了数据库。 – sri85 2015-08-26 13:28:20

1

您可以使用Ming,它有一个内存中的mongo db pymongo连接替换。

import ming 
mg = ming.create_datastore('mim://') 
mg.conn # is the connection 
mg.db # is a db with no name 
mg.conn.somedb.somecol 
# >> mim.Collection(mim.Database(somedb), somecol) 
col = mg.conn.somedb.somecol 
col.insert({'a': 1}) 
# >> ObjectId('5216ac3fe0323a1218f4e9aa') 
col.find().count() 
# >> 1 
+0

与上面相同。我尝试使用MongoDB => 3.0,并且大部分时间都失败了,因为ming并不是为此而设计的。只要复杂性增加,它越来越不可靠。 – 2016-04-04 18:26:29

+0

@HéctorValverdePareja你想做什么失败?正如你可以从代码片段看到的,插入并找到正常工作。 – Pykler 2016-04-05 03:56:14

+0

对不起,当我说'上面'时,我的意思是我在批准的答案中添加的评论。这是关于兼容性。 Ming不支持最新版本的pymongo(后来改为3.0),例如功能“insert_one()”,而不是“insert()”,Ming不支持(或者在2 - 3个月前我不玩它。 – 2016-04-05 08:20:08

相关问题