【发布时间】: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