2011-06-03 44 views
5

我在如何使用Google App Engine-Python設置TDD環境方面很努力。 (我對Python也很新穎)。我的環境如下:單元測試GAE中的webapp.RequestHandler - Python

  • 谷歌App Engine的1.5.0
  • 的IntelliJ 10.2
  • 的IntelliJ設置使用Python 2.5.4本項目

我使用的IntelliJ使用Python插件,所以運行unittests就像點擊ctrl-shft-f10一樣簡單。

我也讀過了關於測試平臺的文檔,併成功測試了數據存儲和內存緩存。但是,我卡住的地方是我如何單元測試我的RequestHandlers。我在Google上掃描了很多文章,其中大部分似乎都是以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") 

它現在可以工作!

+0

我說我的環境信息以及代碼示例中移動MainHandler這樣的路徑可以參考它 – Erds 2011-06-06 12:17:53

+0

加我從尼克·約翰遜的回答 – Erds 2011-06-06 12:36:39

回答

3

我發現我所需要的尼克·約翰遜的代碼稍加修改的版本:

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

這樣做了,謝謝! – Erds 2011-08-24 11:56:23

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

酷使用的代碼,我給一個去一次我下班回家! – Erds 2011-06-03 11:53:44

+0

我添加了你的代碼,我嘗試了上面的問題。我在'request.path'行收到一個錯誤。我得到'AttributeError:無法設置屬性' – Erds 2011-06-06 12:39:45