首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行Tornado AsyncHTTPTestCase时获取错误的文件描述符

运行Tornado AsyncHTTPTestCase时获取错误的文件描述符
EN

Stack Overflow用户
提问于 2012-04-02 01:25:52
回答 1查看 1.3K关注 0票数 2

当使用Tornado AsyncHTTPTestCase运行测试时,我得到一个与测试无关的堆栈跟踪。测试正在通过,所以这可能是在测试清理时发生的?

我使用的是Python 2.7.2,Tornado 2.2。

测试代码为:

代码语言:javascript
复制
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服务器得到了下面的堆栈跟踪。

代码语言:javascript
复制
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

有什么办法干净利落地关闭测试用例吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-02 01:44:18

我深入研究了tornado代码,发现此代码将all_fds设置为True,这会导致io_loop.close()中的堆栈跟踪:

代码语言:javascript
复制
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()将停止堆栈跟踪。

代码语言:javascript
复制
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)

我不确定这种方法会带来什么危害,所以如果其他人有更好的建议,请让我知道!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9966530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档