22

我正在使用 Python 和 Webtest 来测试 WSGI 应用程序。我发现处理程序代码中引发的异常往往会被 Webtest 吞噬,然后引发泛型:

AppError: Bad response: 500 Internal Server Error

我如何告诉它引发或打印导致此问题的原始错误?

4

2 回答 2

6

虽然 clj 的答案确实有效,但您可能仍希望访问测试用例中的响应。为此,您可以在向 TestApp 发出请求时使用expect_errors=True(来自webtest 文档),这样就不会引发 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))
于 2017-04-05T23:33:56.237 回答
4

您的 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以实现您想要的。

于 2015-06-16T09:10:13.357 回答