2016-03-01 76 views
0

我試圖在編寫Tornado應用程序時遵循TDD練習。我有一個端點與get方法,從幾個API獲取數據,過濾器,結合它併發送響應。對於這個get處理程序,我創建了一個幫助程序,它負責異步數據提取。我想爲它編寫測試。如何編寫Tornado的AsyncHTTPClient測試?

助手看起來是這樣的:

class DummyHelper(object): 
    @gen.coroutine 
    def fetch(self, url): 
     http_client = AsyncHTTPClient() 
     response = yield http_client.fetch(url) 

     raise gen.Return(response.body) 

而且測試:

from tornado.testing import AsyncHTTPTestCase 
from tornado.web import HTTPError 
import app 
from lib.handlers.dummy import DummyHelper 
from tornado.testing import gen_test 

class TestDummyHandler(AsyncHTTPTestCase):  
    def get_app(self): 
     return app.get_app() 

    @gen_test 
    def test_200_fetch(self): 
     helper = DummyHelper() 
     response = yield helper.fetch("http://google.com/") 
     self.assertEqual(response.code, 200) 

    @gen_test 
    def test_404_fetch(self): 
     helper = DummyHelper() 
     with self.assertRaises(HTTPError): 
      yield helper.fetch("http://google.com/test") 

一切工作正常進行test_200_fetch。但它不適用於test_404_fetch。如何使它工作?我應該寫這些測試嗎?

回答

1

該測試是針對不同的例外。有兩種HTTPError

您需要使用從HttpClient的一個提高。

提示

  1. ,如果你不是測試RequestHandler你可以用AsyncTestCase,它不需要get_app
  2. 如果你的測試依賴於外部資源(google..com),不能輕易孤立...這不是一個單元測試,更集成一個。這不是一件壞事,但值得注意。

from tornado import gen 
from tornado.httpclient import AsyncHTTPClient 


class DummyHelper(object): 
    @gen.coroutine 
    def fetch(self, url): 
     http_client = AsyncHTTPClient() 
     response = yield http_client.fetch(url) 
     raise gen.Return(response) 


import unittest 
from tornado.testing import AsyncTestCase 
from tornado.httpclient import HTTPError 
from tornado.testing import gen_test 

class TestDummyHandler(AsyncTestCase): 

    @gen_test 
    def test_200_fetch(self): 
     helper = DummyHelper() 
     response = yield helper.fetch("http://google.com/") 
     self.assertEqual(response.code, 200) 

    @gen_test 
    def test_404_fetch(self): 
     helper = DummyHelper() 
     with self.assertRaises(HTTPError): 
      yield helper.fetch("http://google.com/test") 

if __name__ == '__main__': 
    unittest.main() 
+0

可以寫一段代碼如何處理404'DummyHelper.fetch'。我試圖執行你提到的內容,但仍然失敗。 –

+0

我已經添加了一些示例 – kwarunek