UnitTesting GAE中的webapp.RequestHandler - Python

时间:2011-06-03 02:57:20

标签: python unit-testing google-app-engine

我正在努力研究如何使用Google App Engine设置我的TDD环境--Python。 (我也是Python的新手)。我的环境如下:

  • Google App Engine 1.5.0
  • IntelliJ 10.2
  • IntelliJ设置将Python 2.5.4用于此项目

我在Python插件中使用IntelliJ,因此运行unittests就像点击ctrl-shft-f10一样简单。

我还阅读了有关testbed的文档,并成功测试了数据存储区和内存缓存。但是,我遇到的问题是如何对RequestHandlers进行单元测试。我在Google上扫描了很多文章,其中大部分文章似乎都是将gaetestbed与gae合并为测试平台。

在下面的代码示例中,我想知道如何编写一个单元测试(可以在intellij中运行),它测试对'/'的调用返回 - >主页

from google.appengine.ext import webapp
import wsgiref.handlers

class MainHandler(webapp.RequestHandler):

    def get(self):
        self.response.out.write('Home Page')

paths = [
          ('/', MainHandler)
        ]

application = webapp.WSGIApplication(paths, debug=True)

def main():
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
    main()

根据Nick Johnson的回答,我添加了一个名为test的新文件夹,并在该文件夹中添加了一个名为unit_test.py的文件。对于该文件,我添加了以下代码(修改自Kris的答案):

from StringIO import StringIO
from main import MainHandler
import unittest
from google.appengine.ext import webapp

class MyTestCase(unittest.TestCase):
    def test_get(self):
        request = webapp.Request({
            "wsgi.input": StringIO(),
            "CONTENT_LENGTH": 0,
            "METHOD": "GET",
                            "PATH_INFO": "/",
        })
        response = webapp.Response()
        handler = MainHandler()
        handler.initialize(request, response)
        handler.get()
        self.assertEqual(response.out.getvalue(), "Home Page")

它现在有效!

2 个答案:

答案 0 :(得分:3)

我发现我需要一个稍微修改过的Nick Johnson的代码版本:

request = webapp.Request({
    "wsgi.input": StringIO.StringIO(),
    "CONTENT_LENGTH": 0,
    "METHOD": "GET",
    "PATH_INFO": "/",
})
response = webapp.Response()
handler = MainHandler()
handler.initialize(request, response)
handler.get()
self.assertEqual(response.out.getvalue(), "Home Page")

答案 1 :(得分:1)

最简单的方法是实例化处理程序并将其传递给请求和响应对象,然后对结果进行断言:

request = webapp.Request({
    "wsgi.input": StringIO.StringIO(),
    "CONTENT_LENGTH": 0,
    "METHOD": "GET",
})
request.path = '/'
response = webapp.Response()
handler = MainHandler()
handler.initialize(request, response)
handler.get()
self.assertEqual(response.body, "Home Page")