gpt4 book ai didi

unit-testing - 如何对从 webapp2 请求处理程序传递给 jinja2 模板的模板变量进行单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:36 25 4
gpt4 key购买 nike

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

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

问题是,响应大部分只是一堆 HTML 等。

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

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

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

到目前为止,这是我的测试代码,但我被卡住了,因为 response = request.get_response() 只给我一堆 html 而不是原始变量。

import unittest
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()

这是我的处理程序:

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)

这是我的基础处理程序:

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))

也许我对如何进行单元测试有错误的想法,或者我应该以更容易测试的方式编写代码?或者有什么方法可以获取我的代码的状态?

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

最佳答案

您可以模拟 BaseHandler.render_template 方法并测试其参数。

参见 this question获取流行的 Python 模拟框架列表。

关于unit-testing - 如何对从 webapp2 请求处理程序传递给 jinja2 模板的模板变量进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10527166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com