python - Django 测试客户端不处理异常?

标签 python django django-testing

我需要使用 Django 测试虚拟客户端在 Django 中为自定义 handler404 和 handler500 编写一些测试。 第一个很容易测试,而第二个我有问题。

基本上,问题是 Django 测试客户端没有捕获异常并且没有路由到正确的处理程序。这是一个问题,因为我们需要测试是否使用了正确的自定义处理程序和模板。

我们有一个简单的中间件类来模拟测试异常:

  class HTTPStatusCodeMiddleware(object):
    def process_view(self, request, *args):
        if 'cookie_500_error' in request.COOKIES:
            raise Exception('Test exception')

上面的代码适用于在浏览器中进行手动测试。

现在,测试是:

  def test_404_template(self):                                                 
      c = Client()                                                             
      url = '/not_existing.html'                                               
      response = c.get(url)                                                    
      self.assertEqual(response.status_code, 404)  # success                  
      self.assertTemplateUsed(response, 'custom/404.html')  # success   

  def test_500_template(self):                                                 
      c = Client()                                                             
      c.cookies['cookie_500_error'] = '1'                                  
      response = c.get('/')  # here middleware raises exception!!!
      self.assertEqual(response.status_code, 500)
      self.assertTemplateUsed(response, 'custom/500.html')

有什么想法吗? 我没有使用 Selenium 的选项。 谢谢!

最佳答案

Django 3.0 现在支持

新的测试 Client 参数 raise_request_exception 允许控制在请求期间引发的异常是否也应该在测试中引发。为了向后兼容,该值默认为 True。如果为 False 并且发生异常,测试客户端将返回带有属性 exc_info 的 500 响应,这是一个提供所发生异常信息的元组。

c = Client(raise_request_exception=False)

有关信息,请访问 documentation

关于python - Django 测试客户端不处理异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28326621/

相关文章:

python - 当 glob 以斜杠结尾时,如何防止 pathlib 的 Path.glob 返回文件?

python - 知道前两列的值后,如何从第三列中获取值

django - 如何在 Django 中正确使用 assertRaises

python - python中html解析和网页爬取有多大区别

mysql - Django 测试 - South 和 MySQL 的问题

Django 单元测试 on_delete CASCADE

python - 从 Django 运行 shell 命令

python - 使用Python实现链表删除功能时出错

Python链式比较

python - tinys3 无法识别上传文件夹(django)(s3)