0

我有一个类的以下代码库,它封装了与 mongodb 的交互以用于休息应用程序:

import contextlib
import os
from datetime import datetime
from typing import Any, Dict, List, Optional

import motor.motor_asyncio
from pymongo.errors import DuplicateKeyError

DB = "books"
BOOKS_COLLECTION = "books"
AUTHORS_COLLECTION = "authors"
GENRES_COLLECTION = "genres"


BACKEND: Optional["MongoBackend"] = None


class BookExistsException(Exception):
    pass


class MongoBackend:
    def __init__(self, uri: str) -> None:
        self._client = motor.motor_asyncio.AsyncIOMotorClient(uri)
    
    async def get_all_authors(self) -> List[Dict[str, Any]]:
        cursor = self._client[DB][AUTHORS_COLLECTION].find({}, {"_id": 0})
        return [doc async for doc in cursor]

    async def get_all_genres(self) -> List[Dict[str, Any]]:
        cursor = self._client[DB][GENRES_COLLECTION].find({}, {"_id": 0})
        return [doc async for doc in cursor]

    async def get_single_book_by_id(self, book_id: str) -> Dict[str, Any]:
        return await self._client[DB][BOOKS_COLLECTION].find_one(
            {"book_id": book_id}, {"_id": 0}
        )

我想像mongomock测试普通pymongo代码一样使用它来测试它。但是我只是无法理解如何编写将创建类实例的夹具,因为我需要一些 URI,而且由于我们没有事件循环,我认为motor会引发错误。

有人可以给我一些指示吗?可能只是对其中一种方法的简单测试,例如get_all_authors现在可以做的。我检查了这个包pytest-async-mongodb,但这似乎是一个开发版本,我认为它不是标准化的。

请求您提供一些关于如何使用电机等异步代码测试它的提示。提前致谢。

4

0 回答 0