Как я могу издеваться над mongodb, когда переменная содержит монгоклиент - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь смоделировать возвращение db.collection.find, чтобы избежать вызовов базы данных. Я попытался создать mock.patch для mongoclient () и прикрепил к нему return_value. Но когда my_call () вызывает db.collection.find, он просто возвращает Mock Object. У кого-нибудь есть идеи, как это издеваться?

#dao.py
class MyDao():

    def my_call():
        db = mongoclient().db_name
        result = db.collection.find()
        return result


#test_dao.py
import dao

def test_my_call():
    result = dao.my_call()
    assert result == list()

1 Ответ

0 голосов
/ 02 мая 2018

Я думаю, это поможет увидеть ваш текущий макет для редактирования.В общем, вот как я бы смоделировал pymongo collection.find() как отдельную функцию.

test_dao.py

import unittest
import mock
from mock import Mock
import pymongo

class Test_Dao(unittest.TestCase):
    """
    Set up the mock
    """
    @classmethod
    @mock.patch('pymongo.collection')
    def setUpClass(self, mock_mongo):
        a = Mock()
        a.find.side_effect = self.findResponse      # Assign side effect for mocked method
        mock_mongo.return_value = a                 # Importing pymongo.collection returns the mock

    """
    Response Data
    """
    findResponse = 'some data'

    def test_my_call():
        result = dao.my_call()
        assert result == list()

   ...

В вашем случае это стоит попробовать, но может не сработать, потому чтоВы вызываете collection.find () из переменной.

Вам может потребоваться смоделировать MongoClient () так, чтобы db_name имел side_effect, чтобы вернуть поддельный класс.Тогда фальшивому классу потребуется определенный вами метод collection.find ().Это было бы немного дольше и выглядело бы примерно так:

class FakeCollection:
   def find:
      return 'data'

class FakeDatabase:
   def collection:
      return FakeCollection()
...

@classmethod
@mock.patch('pymongo.MongoClient')
def setUpClass(self, mock_mongo):
    a = Mock()
    a.db_name.side_effect = self.dbResponse
    mock_mongo.return_value = a

dbResponse = FakeDatabase()
...