Получение плохого файлового дескриптора при запуске Tornado AsyncHTTPTestCase - PullRequest
2 голосов
/ 01 апреля 2012

При запуске теста с использованием Tornado AsyncHTTPTestCase я получаю трассировку стека, не связанную с тестом.Тест проходит успешно, возможно, это происходит при очистке теста?

Я использую Python 2.7.2, Tornado 2.2.

Код теста:

class AllServersHandlerTest(AsyncHTTPTestCase):

    def get_app(self):
        return Application([('/rest/test/', AllServersHandler)])

    def test_server_status_with_advertiser(self):
        on_new_host(None, '127.0.0.1')
        response = self.fetch('/rest/test/', method='GET')
        result = json.loads(response.body, 'utf8').get('data')
        self.assertEquals(['127.0.0.1'], result)

Тест проходит нормально, но я получаю следующую трассировку стека с сервера Tornado.

OSError: [Errno 9] Bad file descriptor
INFO:root:200 POST /rest/serverStatuses (127.0.0.1) 0.00ms
DEBUG:root:error closing fd 688
Traceback (most recent call last):
  File "C:\Python27\Lib\site-packages\tornado-2.2-py2.7.egg\tornado\ioloop.py", line 173, in close
    os.close(fd)
OSError: [Errno 9] Bad file descriptor

Есть идеи, как правильно завершить тестовый набор?

1 Ответ

2 голосов
/ 01 апреля 2012

Я покопался в коде торнадо и обнаружил, что этот код устанавливает для all_fds значение True, которое затем вызывает трассировку стека в io_loop.close ():

def tearDown(self):
    if (not IOLoop.initialized() or
        self.io_loop is not IOLoop.instance()):
        # Try to clean up any file descriptors left open in the ioloop.
        # This avoids leaks, especially when tests are run repeatedly
        # in the same process with autoreload (because curl does not
        # set FD_CLOEXEC on its file descriptors)
        self.io_loop.close(all_fds=True)
    super(AsyncTestCase, self).tearDown()

Итак, переопределяя tearDown ()в тестовом классе останавливает трассировку стека.

class AllServersHandlerTest(AsyncHTTPTestCase):

    def tearDown(self):
        pass

    def get_app(self):
        return Application([('/rest/test/', AllServersHandler)])

    def test_server_status_with_advertiser(self):
        on_new_host(None, '127.0.0.1')
        response = self.fetch('/rest/test/', method='GET')
        result = json.loads(response.body, 'utf8').get('data')
        self.assertEquals(['127.0.0.1'], result)

Я не уверен, какой ущерб может нанести этот подход, поэтому, если у кого-то есть лучшее предложение, дайте мне знать!

...