【问题标题】:Mocking pymongo for unit testing模拟 mongodb 进行单元测试
【发布时间】:2018-11-21 14:51:36
【问题描述】:

我在 Django REST 中有一个简单的应用程序,我正在使用 Pymongo 连接到 MongoDB。 我的目录结构是这样的:-

appauth/
├── apps.py
├── controllers.py
├── databases
│   ├── initialize_databases.py
│   ├── __init__.py
│   ├── mongo_connector.py
│   ├── redis_connections.py
│   ├── redis_connector.py
├── handlers
│   ├── handlers.py
│   ├── __init__.py
├── helpers
│   ├── helpers.py
│   ├── __init__.py
│   ├── permission_loader.py
├── __init__.py
├── model
│   ├── __init__.py
│   ├── users.py
├── tests.py
├── urls.py

我已经在 mongo 连接器中初始化了我的 Mongo 连接并将其导入到 initialise_databases。然后我在我的整个应用程序中将它从那里导入到我需要的地方。

我的主要问题是,当我想进行单元测试时,如何专门模拟 db 代码。

例如:

def login()
    //code//
    last_filled = db.UserSurvey.find_one({'user_id': user_id})
    //code//
    db.UserSecurityData.count({'user_id': user_id})
    user_role = db.User.find_one({'_id': user_id})

在我的测试中,如果做类似的事情

@patch('pymongo.collection.Collection.find_one')
@patch('pymongo.collection.Collection.update')

def test_03_validate_login(self, mocked_update, mocked_find):
    mocked_find.return_value = user_findone_return 
    //user_findone_return is a variable
    mocked_update.return_value = user_findone_return
    res = self.usr_obj.validate_login(user.email, user.password)
    self.assertEqual(res["gender"],'Male')
    self.assertEqual(res["password_expires_in"],45.0)

测试在正确的返回值下完美运行。但这似乎是在模拟 所有 find_one 调用。我的问题是如何模拟不同的集合及其查询。

我的数据库设置:-

MONGO_URL = "mongodb://" + MONGO_HOST + ":" + MONGO_PORT + "/" + 
MONGO_DB
client = pymongo.MongoClient(MONGO_URL)
db = client.core

我试过@patch('pymongo.core.UserSurvey.find_one') 和类似的迭代。但似乎没有任何效果。

【问题讨论】:

    标签: django mongodb unit-testing django-rest-framework pymongo


    【解决方案1】:

    所以,如果其他人也遇到同样的问题! 补丁应该是相同的,即

    @patch('pymongo.collection.Collection.update')
    

    要为同一个模拟对象提供不同的值,可以使用 .side_effect 来模拟对象。 例如,要模拟更新函数以返回多个值,请将 'mocked_update' obj 传递给函数,然后在函数中

    mocked_update.side_effect = [val1, val2]
    

    这将在第一次调用 update 时有效地传递 val1,第二次调用 val2。

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 2018-09-04
      • 2013-11-12
      • 2018-10-19
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      相关资源
      最近更新 更多