Насмешливое пимонго для юнит-тестирования - PullRequest
0 голосов
/ 12 июня 2018

У меня есть простое приложение в 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.Затем я импортирую его оттуда во все мое приложение, где и когда оно мне нужно.

Моя главная проблема в том, когда я хочу выполнить модульное тестирование, как я специально высмеиваю код БД.

Например:

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)

Тест отлично работает с правильными возвращаемыми значениями. Но это похоже на насмешку all вызовы 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') и подобные итерации.Но, похоже, ничего не работает.

1 Ответ

0 голосов
/ 20 июня 2018

Итак, если кто-то еще застрянет на той же проблеме!Патч должен быть таким же, то есть

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

Чтобы дать разные значения для одного и того же фиктивного объекта, можно использовать .side_effect для имитируемого объекта.Например, чтобы смоделировать функцию обновления для возврата нескольких значений, передайте объект 'mocked_update' в функцию, а затем в функцию

mocked_update.side_effect = [val1, val2]

Это будет эффективно передавать val1 при первом вызове обновления и val2во второй раз.

...