【问题标题】:UnitTesting the webapp.RequestHandler in GAE - Python在 GAE 中对 webapp.RequestHandler 进行单元测试 - Python
【发布时间】:2011-06-03 02:57:19
【问题描述】:

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

  • 谷歌应用引擎 1.5.0
  • IntelliJ 10.2
  • IntelliJ 设置为此项目使用 Python 2.5.4

我正在使用带有 Python 插件的 IntelliJ,因此运行单元测试就像点击 ctrl-shft-f10 一样简单。

我还阅读了 testbed 上的文档,并成功测试了数据存储和内存缓存。但是,我卡住的地方是我如何对我的 RequestHandlers 进行单元测试。我在谷歌上浏览了很多文章,其中大部分似乎是预先将 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")

现在可以了!

【问题讨论】:

  • 我添加了有关我的环境的信息,并在代码示例中移动了 MainHandler 以便路径可以引用它
  • 添加了我从尼克约翰逊的回答中使用的代码

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


【解决方案1】:

我发现我需要对 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")

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我在上面的问题中添加了我尝试过的代码。我在“request.path”行收到错误消息。我收到“AttributeError:无法设置属性”
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多