如何模拟mongodb for python unittests?

Mah*_*aly 11 python unit-testing mocking mongodb pymongo

我正在使用mock适用于Python 2.7的模块来模拟其他功能并使用

unittest 用于编写单元测试。

我想知道模拟MongoDB是否与使用模拟功能(mock.patch被调用的功能?)不同?或者我需要为此使用另一个不同的包?

我不认为我想运行测试mongodb实例。我只需要一些速度数据并能够调用pymongo功能。我只是在想是否有一种方法可以为模块编写模拟(例如pymongo),或者mock模块可以实现任何目标,因此我有点迷失了。

因此,如果您可以提供示例或教程,请多加赞赏。

测试代码

from pymongo import MongoClient

monog_url = 'mongodb://localhost:27017'
client = MongoClient(monog_url)
db = client.db

class Dao(object):
   def __init__(self):
      pass

   def save(self, user):
      db_doc = {
        'name': user.name,
        'email': user.email
      }
      db.users.save(db_doc)

   def getbyname(self, user):
      db_doc = {
        'name': user.name,
      }
      return db.users.find(db_doc)
Run Code Online (Sandbox Code Playgroud)

为了测试这一点,我真的不想要测试mongodb并运行它!而且,我想我不想模拟db.userssave和db.users.find,因为我希望实际上能够检索我保存的数据并确保它在db中。我认为我需要为记忆中的每个模型创建一些灯具并使用它们。我是否需要外部工具来做到这一点?

我正在考虑保留一些虚假数据,只是不知道如何正确处理它。

users = { 
    {'name' : 'Kelly', 'email' : 'kelly@gmail.com'},
    {'name': 'Sam', 'email': 'sam@gmail.com'}
}
Run Code Online (Sandbox Code Playgroud)

mir*_*tle 10

如果您只是做一些简单的事情,并且实际上不需要按字段检索,您也可以这样做。

@mock.patch("pymongo.collection.Collection.find")
def test_name(self, mock_find):
    mock_find.return_value = {'name' : 'Kelly', 'email' : 'kelly@gmail.com'}
    # rest of test
Run Code Online (Sandbox Code Playgroud)


Kri*_*ris 8

我建议使用mongomock模拟mongodb。它基本上是带有pymongo接口的内存mongodb,是专门为此目的而制作的。

https://github.com/mongomock/mongomock

  • 对于刚接触 mongomock 的人来说,只需两行代码就可以开始使用它: import mongomock`client = mongomock.MongoClient()`。之后,您可以按照使用“pymongo”的方式使用“client.my_db.my_coll.insert_one({'a': 1})”。 (4认同)

A. *_*vis 2

您当然可以模拟 PyMongo,但我建议模拟 MongoDB 服务器本身。我为 MongoDB 编写了一个可以完全控制的纯 Python 模拟器,无论您选择什么,它都会响应 MongoDB Wire Protocol 消息:

http://mockupdb.readthedocs.io/tutorial.html

以下是在 Python 应用程序中使用 MockupDB 的示例:

https://emptysqua.re/blog/test-mongodb-failures-mockupdb/

它需要对 MongoDB 有线协议有深入的了解,但无论如何,这是一项有用的技能。