2016-11-21 4 views
0

Hy. Я пытаюсь написать тест для webHander:получена ошибка: tornado.ioloop.TimeoutError: операция была отключена через 5 секунд. Что делать?

import pytest 
import tornado 
from tornado.testing import AsyncTestCase 
from tornado.httpclient import AsyncHTTPClient 
from tornado.web import Application, RequestHandler 
import urllib.parse 


class TestRESTAuthHandler(AsyncTestCase): 
@tornado.testing.gen_test 
def test_http_fetch_login(self): 
    data = urllib.parse.urlencode(dict(username='admin', password='123456')) 
    client = AsyncHTTPClient(self.io_loop) 
    response = yield client.fetch("http://localhost:8080//#/login", method="POST", body=data) 
    # Test contents of response 
    self.assertIn("Automation web console", response.body) 

Полученное ошибка при выполнении теста:

повышение TimeoutError ('Операция таймаут после% S секунд' % таймаута)

tornado.ioloop.TimeoutError: Операция завершена через 5 секунд

+0

Есть ли HTTP-сервер, который прослушивает локальный порт 8080? Ответит ли он? –

+0

нет. Я новичок в этом. Как это сделать? и, может быть, я должен запустить здесь сервер торнадо? Я думаю, что что-то не хватает в тестовом коде. – Serhiy

ответ

0

Вам необходимо использовать AsyncHTTPTestCase, а не только AsyncTestCase. Хороший пример в самотестировании смерча:

https://github.com/tornadoweb/tornado/blob/d7d9c467cda38f4c9352172ba7411edc29a85196/tornado/test/httpclient_test.py#L130-L130

Вы должны реализовать get_app вернуть приложение с RequestHandler вы написали. Затем, сделать что-то вроде:

class TestRESTAuthHandler(AsyncHTTPTestCase): 
    def get_app(self): 
     # implement this 
     pass 

    def test_http_fetch_login(self): 
     data = urllib.parse.urlencode(dict(username='admin', password='123456')) 
     response = self.fetch("http://localhost:8080//#/login", method="POST", body=data) 
     # Test contents of response 
     self.assertIn("Automation web console", response.body) 

AsyncHTTPTestCase предоставляет удобные функции, так что вам не нужно писать сопрограмм с «gen.coroutine» и «выход».

Кроме того, я замечаю, что вы извлекаете URL-адрес с фрагментом после «#», обратите внимание, что в реальной жизни веб-браузеры не включают фрагмент при отправке URL-адреса на сервер. Таким образом, ваш сервер будет видеть URL-адрес только как «//», а не «// #/login».