如何在Django单元测试中生成Cloudflare Turnstile令牌
在Django单元测试中生成Cloudflare Turnstile令牌的几种方法
方法一:测试环境直接绕过验证(推荐)
单元测试的核心是验证业务逻辑,没必要走真实的人机验证流程。可以在Turnstile的验证逻辑中加入判断,当处于测试环境时直接跳过验证:
# 示例:在你的Turnstile验证函数中添加测试环境判断 from django.conf import settings def validate_turnstile_token(token): # 测试环境下直接返回验证通过 if settings.TESTING: return True # 生产环境正常调用Cloudflare API进行验证 # ... 原有验证逻辑代码
之后在测试的setUp里,token字段可以随便填一个值,甚至如果视图允许的话可以直接省略。
方法二:使用Cloudflare官方测试令牌或生成假令牌
Cloudflare提供了专门用于测试的令牌,无需真实生成:
0x4AAAAAAAC3N4tYEAfxG4iU:始终验证通过0x4AAAAAAAC3N4tYEAfxG4iV:始终验证失败
如果需要每次测试用不同的令牌,可以写个简单函数生成符合Turnstile格式的随机字符串:
import random import string def generate_fake_turnstile_token(): # 生成模仿Turnstile令牌格式的随机字符串 part1 = '0.' + ''.join(random.choices(string.ascii_letters + string.digits + '-_', k=100)) part2 = '.' + ''.join(random.choices(string.ascii_letters + string.digits + '-_', k=20)) part3 = '.' + ''.join(random.choices(string.hexdigits, k=64)) return part1 + part2 + part3 # 在测试类的setUp中使用 class TestSignupView(BaseTestCase): def setUp(self) -> None: super().setUp() self.view = SignupView.as_view() self.data = { "first_name": "test", "last_name": "user", "email": "testuser1@gmail.com", "password": "testpassword", "re_password": "testpassword", "company_name": "Testing Company", "token": generate_fake_turnstile_token() }
方法三:用Mock模拟验证结果
如果不想修改原有验证逻辑,可以用unittest.mock来模拟验证函数的返回值,这样token字段随便填都能通过:
from unittest.mock import patch from rest_framework.test import APIClient class TestSignupView(BaseTestCase): def setUp(self) -> None: super().setUp() self.client = APIClient() self.data = { "first_name": "test", "last_name": "user", "email": "testuser1@gmail.com", "password": "testpassword", "re_password": "testpassword", "company_name": "Testing Company", "token": "random-test-token" } @patch('signup.views.validate_turnstile_token') # 替换成你实际的验证函数路径 def test_signup_success(self, mock_validate): mock_validate.return_value = True # 强制模拟验证通过 response = self.client.post('/signup/', self.data) self.assertEqual(response.status_code, status.HTTP_201_CREATED)
内容的提问来源于stack exchange,提问作者Omnia Osman
相关产品推荐
相关产品推荐

