Вот мой тестовый файл
import pytest
import websockets
class Server:
def __init__(self, port, event_loop=None):
self.port = port
self.event_loop = event_loop
self.someone_joined = False
async def welcome(self, websocket, path):
self.someone_joined = True
def start(self):
start_server = websockets.serve(self.welcome, "localhost", self.port)
self.event_loop.run_until_complete(start_server)
@pytest.fixture
def server(unused_tcp_port, event_loop):
server = Server(unused_tcp_port, event_loop)
server.start()
return server
async def connection_working(uri):
async with websockets.connect(uri) as websocket:
pass
async def connection_not_working(uri):
return await websockets.connect(uri)
@pytest.mark.asyncio
async def test_connection(server):
uri = f"ws://localhost:{server.port}"
assert not server.someone_joined
# await connection_working(uri)
await connection_not_working(uri) # raises RuntimeError: no running event loop
assert server.someone_joined
С этим я пытаюсь вернуть веб-сокет с открытым подключением, чтобы я мог отправлять сообщения в оставшейся части теста.
Подключение с помощью диспетчера контекста работает, но если я пытаюсь подключиться без ожидания, ожидая websockets.connect, как предлагается в документации, возникает ошибка RuntimeError: нет запущенного события l oop.
Я пробовал это вне контекста тестирования, и это работает, так что, может быть, это как-то связано с pytest-asyncio?
Я действительно не уверен, что делаю это правильно, так Я либо ищу способ заставить этот код работать, либо правильный способ тестирования серверов веб-сокетов.
Version:
python==3.8.1
websockets==8.1
pytest==5.3.5
pytest-asyncio==0.10.0