Почему подключение к веб-сокету с помощью диспетчера контекста работает, но не в этом контексте? - PullRequest
0 голосов
/ 08 марта 2020

Вот мой тестовый файл

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
...