PyTest Tornado: «SimpleAsyncHTTPClient» не повторяется - PullRequest
0 голосов
/ 11 сентября 2018

Попытка создать тестовый код для длительного опроса в PyTest, Tornado.

Мой тестовый код указан ниже.

conftest.py

from tornado.httpclient import  AsyncHTTPClient


@pytest.fixture
async def tornado_server():
    print("\ntornado_server()")

@pytest.fixture
async def http_client(tornado_server):
    client = AsyncHTTPClient()
    return client


@pytest.yield_fixture(scope='session')
def event_loop(request):
    loop = asyncio.get_event_loop_policy().new_event_loop()
    yield loop
    loop.close()

test_my.py

from tornado.httpclient import HTTPRequest, HTTPError
def test_http_client(event_loop):
    url = 'http://httpbin.org/get'
    resp = event_loop.run_until_complete(http_client(url))
    assert b'HTTP/1.1 200 OK' in resp

Я ожидал, что этот результат закончится как успех. Но это не удалось.

def test_http_client(event_loop):
    url = 'http://httpbin.org/get'
    resp = event_loop.run_until_complete(http_client(url))
   assert b'HTTP/1.1 200 OK' in resp E       TypeError: argument of type 'SimpleAsyncHTTPClient' is not iterable

Что я сделал не так?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018
  1. Чтобы использовать прибор Pytest, вы должны указать его в качестве аргумента своей функции:

    def test_http_client(event_loop, http_client):
    
  2. AsyncHTTPClient не вызывается; у него есть fetch метод:

    resp = event_loop.run_until_complete(http_client.fetch(url))
    

В вашем коде происходит то, что вы вызываете прибор, а не позволяете pytest его инициализировать, и передаете url в качестве аргумента tornado_server.

Также рассмотрите возможность использования pytest-asyncio или pytest-tornado, что позволяет использовать await вместо run_until_complete (это обычный метод использования pytest с торнадо или asyncio):

@pytest.mark.asyncio
async def test_http_client(http_client):
    url = 'http://httpbin.org/get'
    resp = await http_client.fetch(url)
    assert resp.code == 200
0 голосов
/ 11 сентября 2018

Попробуйте assert "200" in resp.code или assert "OK" in resp.reason в функции test_http_client ().

Объект, которому назначается resp, - это AsyncHTTPClient, а не сам ответ. Чтобы вызвать ответное сообщение, вам нужно что-то вроде resp.code, resp.reason, resp.body, resp.headers и т. Д.

Вот список вещей, которые вы можете назвать http://www.tornadoweb.org/en/stable/httpclient.html#response-objects

...