因此,我尝试编写几个测试来测试使用异步MongoDB连接的函数。要连接到MongoDB,我使用带asyncio的Motor。我需要帮助模拟电机连接
我的代码:
commons.py
mongo = None
黑名单.py
import commons
class Blacklist(object):
async def check_if_blacklisted(self, word: str):
blacklisted = False
if await commons.mongo.dbtest.blacklist.find_one({'word': word}):
blacklisted = True
return blacklisted
main.py
import asyncio
from blacklist import Blacklist
from motor.motor_asyncio import AsyncIOMotorClient
import commons
async def run():
commons.mongo = AsyncIOMotorClient("mongodb://localhost", io_loop=asyncio.get_event_loop())
blacklist_checker = Blacklist()
result = await blacklist_checker.check_if_blacklisted(word="should_be_false")
print(result)
# > False
result = await blacklist_checker.check_if_blacklisted(word="should_be_true")
print(result)
# > True
loop = asyncio.get_event_loop()
loop.run_until_complete(run())
loop.close()
我现在想通过模拟电机连接来测试blacklist.py,但我似乎无法使测试正常运行。以下是我尝试过的代码:
测试黑名单.py
import pytest
from blacklist import Blacklist
class TestBlacklist(object):
@pytest.fixture
async def motor(self, event_loop):
# I know I'm not mocking the Motor Connection here,
# but just wanted to show you the output using this fixture.
commons.mongo = motor.motor_asyncio.AsyncIOMotorClient(io_loop=event_loop)
yield commons.mongo
commons.mongo.close()
@pytest.mark.asyncio
async def test_check_if_blacklisted(self):
blacklist_checker = Blacklist()
blacklisted = await blacklist_checker.check_if_blacklisted(word="should_be_false")
assert blacklisted == False
# > AttributeError: 'NoneType' object has no attribute 'blacklist'
pytest mongodb:
import pytest
from unittest.mock import patch
from blacklist import Blacklist
class TestBlacklist(object):
@pytest.mark.asyncio
async def test_check_if_blacklisted(self, mongodb):
with patch("blacklist.commons.mongo") as db:
db = mongodb
blacklist_checker = Blacklist()
blacklisted = await blacklist_checker.check_if_blacklisted(word="should_be_false")
assert blacklisted == False
# > TypeError: object MagicMock can't be used in 'await' expression
我尝试在线搜索,但找不到合适的线程来帮助我在模拟异步电机连接时执行测试。此外,如果您认为我的测试方向不正确,请告诉我,因为我是编写测试的新手,尤其是异步db连接
注意:blacklist.py有各种需要MongoDB功能的函数,因此如果在我的测试中\u blacklist.py我可以初始化commons.mongo一次,并且所有后续测试都使用它,那就太好了
您可以使用pytest async MongoDB模拟异步MongoDB数据库,但请记住它已经过时,并且存在依赖项错误,因此您必须按照以下方式修复依赖项版本:
使用pytest async mongodb可以通过添加名为async\u mongodb的参数,在测试中获得模拟数据库。 我会告诉你代码和结构
main.py
黑名单.py
commons.py
测试黑名单.py
pytest.ini
blacklist.json
夹具也可以是.yaml,可以定义所需的数量。阅读package documentation了解更多信息
因为它已经过时了,所以我创建了一个fork来更新它并用新特性改进它。我们邀请您查看它,如果您愿意,可以使用它
相关问题 更多 >
编程相关推荐