如何用python模拟mongo

问题描述 投票:0回答:1

如何创建一个模拟的 mongo db 对象来使用 python 测试我的软件?
我尝试了https://pytest-mock-resources.readthedocs.io/en/latest/mongo.html但出现错误。
首先,我尝试了下面的代码:

def insert_into_customer(mongodb_connection):
    collection = mongodb_connection['customer']
    to_insert = {"name": "John", "address": "Highway 37"}
    collection.insert_one(to_insert)


from pytest_mock_resources import create_mongo_fixture
mongo = create_mongo_fixture()

def test_insert_into_customer(mongo):
    insert_into_customer(mongo)

    collection = mongo['customer']
    returned = collection.find_one()

    assert returned == {"name": "John", "address": "Highway 37"}


test_insert_into_customer(mongo)

我收到以下错误:

Traceback (most recent call last):
  File "/home/ehasan-karbasian/Desktop/NationalEliteFoundation/serp_matcher/src/mock_mongo.py", line 19, in <module>
    test_insert_into_customer(mongo)
  File "/home/ehasan-karbasian/Desktop/NationalEliteFoundation/serp_matcher/src/mock_mongo.py", line 11, in test_insert_into_customer
    insert_into_customer(mongo)
  File "/home/ehasan-karbasian/Desktop/NationalEliteFoundation/serp_matcher/src/mock_mongo.py", line 2, in insert_into_customer
    collection = mongodb_connection['customer']
TypeError: 'function' object is not subscriptable

然后我尝试了代码:

def insert_into_customer(mongodb_connection):
    collection = mongodb_connection['customer']
    to_insert = {"name": "John", "address": "Highway 37"}
    collection.insert_one(to_insert)


from pymongo import MongoClient
from pytest_mock_resources import create_mongo_fixture

mongo = create_mongo_fixture()


def test_create_custom_connection(mongo):
    client = MongoClient(**mongo.pmr_credentials.as_mongo_kwargs())
    db = client[mongo.config["database"]]

    collection = db["customers"]
    to_insert = [
        {"name": "John"},
        {"name": "Viola"},
    ]
    collection.insert_many(to_insert)

    result = collection.find().sort("name")
    returned = [row for row in result]

    assert returned == to_insert


test_create_custom_connection(mongo)

并得到错误:

Traceback (most recent call last):
  File "/home/ehasan-karbasian/Desktop/NationalEliteFoundation/serp_matcher/src/mock_mongo.py", line 30, in <module>
    test_create_custom_connection(mongo)
  File "/home/ehasan-karbasian/Desktop/NationalEliteFoundation/serp_matcher/src/mock_mongo.py", line 14, in test_create_custom_connection
    client = MongoClient(**mongo.pmr_credentials.as_mongo_kwargs())
AttributeError: 'function' object has no attribute 'pmr_credentials'

看起来

mongo
function
而不是
MongoClient

我如何使用库
pytest_mock_resources
来模拟mongo?
是否有更好的库来模拟 monodb 以使用 pytest 进行测试?

python unit-testing mocking pymongo pytest-mock
1个回答
1
投票
import mongomock
client = mongomock.MongoClient()
database = client.__getattr__(database_name)
collection = database.__getattr__(collection_name)

您可以同时定义任意数量的客户端、数据库和集合。

© www.soinside.com 2019 - 2024. All rights reserved.