我正在开发一个已经有数百个单元测试的项目,其中许多使用内置的 django 客户端或 django 休息框架 APIClient 来发出请求和测试响应。
最近实现了使 SSL 在本地工作的必要条件,并设置SECURE_SSL_REDIRECT
为真(试图让我们的dockerizeddev
and test
环境尽可能接近production
as possible),我发现这么多单元测试失败了,因为(API)客户端请求默认总是使用 http,而不是 https。
许多(大多数)请求如下所示:
response = self.client.get(some_url)
我知道我可以使用:
response = self.client.get(some_url, secure=True)
但这确实意味着改变a lot单元测试。使用时也是如此follow=True
,但还有一个额外的缺点,即这可能会产生其他一些不良行为。
我看不到将安全请求的使用设置为 Django 客户端中的默认行为的方法。我可以制作自己的 SecureClient(和 SecureAPIClient),但是我必须确保制作一个新的基础 TestCase(可能是多个)来继承,并在所有测试中随处更改它 - 仍然有很多工作。
当然可以对客户端进行猴子修补,但我不愿意这样做,因为它可能会产生不良影响,以后很难调试。
太长了;有没有一种简单的(理想支持的)方法,通过 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:包裹get
and post
的方法APIClient
:
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)。原因如下:
django.test.client
只是对真实客户的模仿。它可以对您的观点进行单元测试。它不会产生真正的 WSGI 请求,因此测试环境无论如何都不会与生产环境匹配。
SECURE_SSL_REDIRECT
is a SecurityMiddleware
环境。不要对第三方代码进行单元测试 https://coderwall.com/p/45wycg/don-t-unit-test-third-party-code.
确保您的代码始终使用 SSL 是一个很好的目标。然而,这是一个一体化测试问题。适合这项工作的工具是硒 + LiveServerTestCase https://docs.djangoproject.com/en/2.0/topics/testing/tools/#django.test.LiveServerTestCase.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)