如何单元测试从webapp2请求处理程序传递给jinja2模板的模板变量 [英] how to unittest the template variables passed to jinja2 template from webapp2 request handler

查看:108
本文介绍了如何单元测试从webapp2请求处理程序传递给jinja2模板的模板变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以前从未做过单元测试。我想掌握它。



我试图测试我的webapp2处理程序。为此,我认为向请求发送请求是一个好主意,例如:

  request = webapp2.Request .blank('/')
#获取该请求的响应。
response = request.get_response(main.app)

问题是,响应主要只是一堆HTML等。



我想看看在处理程序转换为HTML之前从处理程序传递给我的jinja2模板的内容。



我希望我的测试能够处理处理程序类代码中的状态。我不能在响应处理程序中看到某些变量的样子,然后我想看看dict模板在传递给render_to_response()之前看起来是什么样子。

我想测试这些变量是否具有正确的值。

以下是我的测试代码,但由于response = request.get_response( )只是给了我一堆html而不是原始变量。

  import unittest 
#from google.appengine。 ext import db
#from google.appengine.ext import testbed
#from google.appengine.datastore import datastore_stub_util
import main
import webapp2

class DemoTestCase(unittest.TestCase):
def setUp(self):
pass
$ b def tearDown(self):
pass

def testNothing(self):
self.assertEqual(42,21 + 21)

def testHomeHandler(self):
#构建一个请求对象,传递要测试的URI路径编辑。
#您还可以传递标头,查询参数等。
request = webapp2.Request.blank('/')
#获取该请求的响应。
response = request.get_response(main.app)

#让我们检查一下响应是否正确。
self.assertEqual(response.status_int,200)
self.assertEqual(response.body,'Hello,world!')


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

以下是我的处理程序:

  class HomeHandler(BaseHandler):
def get(self,file_name_filter = None,category_filter = None):
file_names ='。','','','','','','','','','','','' ).replace( - >,)

for file_names:
with open('blog_posts /%s'%fn)as file_:
heading = get_line(file_)
link_name = get_line(file_)
category = get_line(file_)

date_ = datetime.strptime(fn.split(_) [0],%Y%m%d)

blog_dict = {'date':date_,'heading':标题,
'link_name':link_name,
'category':category,
'filename':fn.replace(。html,),
'raw_file_name':fn}

blogs.append(blog_dict)

categories = Counter(d ['category'] for d in blogs)
templates = {'categories':categories,
'blogs':blogs,
'file_name_filter':file_name_filter,$ b $'category_filter':category_filter}

assert(len(file_names)== len(set(d ['' link_name'] for d in blogs)))

self.render_template('home.html',** templates)

这里是我的基本操作符:

$ p $ class BaseHandler(webapp2.RequestHandler):
@ webapp2.cached_property
def jinja2(self):
return jinja2.get_jinja2(app = self.app)

def ren der_template(self,filename,** kwargs):
#kwargs.update({})
#TODO()数据存储缓存在这里用于缓存(处理程序名称,处理程序参数,可更改参数,app_upload_date)
#TODO()将呈现的页面写入其自己的html文件,并且只提供整个文件。 (包括所有帖子)。 JQuery可以显示/隐藏帖子。
self.response.write(self.jinja2.render_template(filename,** kwargs))

也许我对如何进行单元测试有错误的想法,或者我应该用易于测试的方式编写我的代码?或者是否有某种方法来获取我的代码的状态?



另外,如果有人要重写代码并更改变量名称,那么测试将会中断。 。



请告诉我的情况:X

解决方案

mock BaseHandler.render_template 方法并测试其参数。 是一个流行的Python模拟框架列表。


I've never done unit testing before. I want to master it.

I'm trying to test my webapp2 handlers. To do this, I thought it would be a good idea to send a request to the handler e.g.:

request = webapp2.Request.blank('/')
# Get a response for that request.
response = request.get_response(main.app)

The problem is, response is mostly just a bunch of HTML etc.

I want to look at what was passed to my jinja2 template from the handler before it was turned into HTML.

I want my test to get at the state within the handler class code. I wan't to be able to see what certain variables looked like in the response handler, and then I want to see what the dict templates looks like before it was passed to render_to_response()

I want to test these variables have the correct values.

Here is my test code so far, but I'm stuck because response = request.get_response() just gives me a bunch of html and not the raw variables.

import unittest
#from google.appengine.ext import db
#from google.appengine.ext import testbed
#from google.appengine.datastore import datastore_stub_util
import main
import webapp2

class DemoTestCase(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def testNothing(self):
        self.assertEqual(42, 21 + 21)

    def testHomeHandler(self):
        # Build a request object passing the URI path to be tested.
        # You can also pass headers, query arguments etc.
        request = webapp2.Request.blank('/')
        # Get a response for that request.
        response = request.get_response(main.app)

        # Let's check if the response is correct.
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.body, 'Hello, world!')


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

and here is my handler:

class HomeHandler(BaseHandler):
    def get(self, file_name_filter=None, category_filter=None):
        file_names = os.listdir('blog_posts')
        blogs = []

        get_line = lambda file_: file_.readline().strip().replace("<!--","").replace("-->","")

        for fn in file_names:
            with open('blog_posts/%s' % fn) as file_:
                heading = get_line(file_)
                link_name = get_line(file_)
                category = get_line(file_)

            date_ = datetime.strptime(fn.split("_")[0], "%Y%m%d")

            blog_dict = {'date': date_, 'heading': heading,
                         'link_name': link_name,
                         'category': category,
                         'filename': fn.replace(".html", ""),
                         'raw_file_name': fn}

            blogs.append(blog_dict)

        categories = Counter(d['category'] for d in blogs)
        templates = {'categories': categories,
                     'blogs': blogs,
                     'file_name_filter': file_name_filter,
                     'category_filter': category_filter}

        assert(len(file_names) == len(set(d['link_name'] for d in blogs)))

        self.render_template('home.html', **templates)

and here is my basehandler:

class BaseHandler(webapp2.RequestHandler):
    @webapp2.cached_property
    def jinja2(self):
        return jinja2.get_jinja2(app=self.app)

    def render_template(self, filename, **kwargs):
        #kwargs.update({})
        #TODO() datastore caching here for caching of (handlername, handler parameters, changeable parameters, app_upload_date)
        #TODO() write rendered page to its own html file, and just serve that whole file. (includes all posts). JQuery can show/hide posts.
        self.response.write(self.jinja2.render_template(filename, **kwargs))

Perhaps I have got the wrong idea of how to do unit testing, or perhaps I should have written my code in a way that makes it easier to test? or is there some way of getting the state of my code?

Also if someone were to re-write the code and change the variable names, then the tests would break..

please advise on my situation :X

解决方案

You can mock BaseHandler.render_template method and test its parameters.

See this question for a list of popular Python mocking frameworks.

这篇关于如何单元测试从webapp2请求处理程序传递给jinja2模板的模板变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆