gpt4 book ai didi

Django SECURE_SSL_REDIRECT 中断使用内置客户端的单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 12:46:00 25 4
gpt4 key购买 nike

我正在处理一个已经有数百个单元测试的项目,其中许多使用内置的 django 客户端或 django rest 框架 APIClient 来发出请求和测试响应。

最近实现了使 SSL 在本地工作的必要条件,并将 SECURE_SSL_REDIRECT 设置为 True(试图使我们的 dockerised devtest尽可能接近 production 的环境,可能),我发现很多单元测试都失败了,因为 (API)Clients 默认情况下总是请求使用 http,而不是 https。

许多(大多数)请求看起来像这样:

response = self.client.get(some_url)

我知道我可以使用:

response = self.client.get(some_url, secure=True)

但这确实意味着要更改很多单元测试。使用 follow=True 也是如此,但有一个额外的缺点,即这可能会产生一些其他不良行为。

我看不到将安全请求的使用设置为 Django 客户端中的默认行为的方法。我可以制作我自己的 SecureClient(和 SecureAPIClient),但我必须确保我制作一个新的基础 TestCase(可能是多个)来继承,并在所有测试的任何地方更改它 - 仍然有很多工作。

当然可以对客户端进行猴子修补,但我不愿意这样做,因为它可能会产生后期难以调试的不良影响。

TLDR;是否有一种简单的(理想情况下支持的)方法,通过 django 测试的客户端发出所有单元测试请求,默认使用 SSL?

最佳答案

  • 选项 1。在需要时禁用 SECURE_SSL_REDIRECT:

    from django.test import override_settings

    class FooTest(TestCase):

    def setUp(self):
    settings_manager = override_settings(SECURE_SSL_REDIRECT=False)
    settings_manager.enable()
    self.addCleanup(settings_manager.disable)
  • 选项 2:包装 APIClientgetpost 方法:

    class ApiTestCase(TestCase):
    def setUp(self):
    self.client = APIClient()

    def get(self, *args, **kwargs):
    return self.client.get(secure=True, *args, **kwargs)

    def post(self, *args, **kwargs):
    return self.client.post(secure=True, *args, **kwargs)
  • 选项 3:只为测试环境维护一个单独的设置文件,不设置 SECURE_SSL_REDIRECT

我已经尝试了所有三个选项并建议使用 (3)。原因如下:

  1. django.test.client 只是对真实客户端的模仿。它可以对您的观点进行单元测试。它不会产生真正的 WSGI 请求,所以测试环境无论如何都不会匹配生产环境。

  2. SECURE_SSL_REDIRECT 是一个 SecurityMiddleware 设置。 Don't unit test third-party code .

  3. 确保您的代码始终使用 SSL 是一个很好的目标。但是,这是一个集成 测试问题。适合这项工作的工具是 Selenium + LiveServerTestCase .

关于Django SECURE_SSL_REDIRECT 中断使用内置客户端的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49626899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com