在Tornadoweb中使用的测试模板和变量

时间:2012-03-28 15:01:53

标签: python unit-testing tornado

我正在使用下面的代码测试MainHandler。

import tornado.httpserver 
import tornado.httpclient 
import tornado.ioloop 
import tornado.web 
import unittest 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
        kwargs = {'name' : 'world'}
        self.render('template.html', **kwargs)

class TestTornadoWeb(unittest.TestCase): 
    http_server = None        response = None 

    def setUp(self): 
        application = tornado.web.Application([ 
                (r'/', MainHandler), 
                ])   
        self.http_server = tornado.httpserver.HTTPServer(application) 
        self.http_server.listen(8888) 

    def tearDown(self): 
        self.http_server.stop() 

    def handle_request(self, response): 
        self.response = response 
        tornado.ioloop.IOLoop.instance().stop() 

    def testHelloWorldHandler(self): 
        http_client = tornado.httpclient.AsyncHTTPClient() 
        http_client.fetch('http://localhost:8888/', self.handle_request) 
        tornado.ioloop.IOLoop.instance().start() 
        self.failIf(self.response.error) 
        self.assertEqual(self.response.body, 'Hello, world') 

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

template.html:

Hello, {{name}}

我想测试模板及其变量 我如何测试是否正确收到姓名?

我可以使用一些属性来执行断言,或者这应该以另一种方式完成?

1 个答案:

答案 0 :(得分:1)

这基本上就是你在断言中已经做过的事情。由于客户端实例正在拉动渲染模板,因此无法匹配模板变量。通过在模板中使用kwargs,它将这些kwargs渲染到模板中 - 其中{{name}}是'world'(预期输出),您的模板变量已被接收并呈现。

如果你需要测试特定的输出,一个相当不优雅的解决方案可能是为每个变量分配一个无意义的<div>标签(即<div name="name">{{name}}</div>),然后使用assertIn方法(即,self.assertIn(self.response.body, '<div name="name">world</div>'))来测试正确的输出。