2012-11-22 47 views
18

我正在使用Python和Webtest來測試WSGI應用程序。我發現,在處理程序代碼引起的異常往往被WebTest的被吞噬,然後提出了一個通用的:在Webtest測試失敗中找到真正的錯誤

AppError: Bad response: 500 Internal Server Error 

我怎麼告訴它提高或打印導致原來這個錯誤?

+0

在WSGI配置中會有'error'重定向到某個文件。您可以檢查某些文件是否有錯誤。 – Nilesh

回答

3

您的WSGI框架和服務器包含處理程序,它們捕獲異常並執行某些操作(在主體中呈現堆棧跟蹤,將回溯記錄到日誌文件等)。默認情況下,Webtest不會顯示實際的響應,如果您的框架在正文中呈現堆棧跟蹤,這可能會非常有用。我用下面的擴展WebTest的,當我需要看一下響應的正文:

class BetterTestApp(webtest.TestApp): 

    """A testapp that prints the body when status does not match.""" 

    def _check_status(self, status, res): 
     if status is not None and status != res.status_int: 
      raise webtest.AppError(
       "Bad response: %s (not %s)\n%s", res.status, status, res) 
     super(BetterTestApp, self)._check_status(status, res) 

獲得了發生了什麼異常取決於你使用的是什麼框架和服務器的控制。對於內置的wsgiref模塊,您可能可以覆蓋error_output以實現您想要的效果。

+0

報告上游:https://github.com/Pylons/webtest/issues/176 –

2

儘管clj的答案肯定有效,但您仍然可能想要在測試用例中訪問響應。爲此,當您向TestApp發出請求時,可以使用expect_errors=True(來自webtest documentation),這樣就不會引發AppError。這裏是一個我期待403錯誤的例子:

# attempt to access secure page without logging in 
response = testapp.get('/secure_page_url', expect_errors=True) 

# now you can assert an expected http code, 
# and print the response if the code doesn't match 
self.assertEqual(403, response.status_int, msg=str(response)) 
+0

感謝您的支持!我沒有在我的測試中捕獲其他異常,直到看到expect_errors arg。 –

相關問題