Django Rest Framework测试场景下如何禁用节流(throttling)功能
问题原因
DRF 的节流类会在模块导入阶段就读取配置中的限流速率并缓存,你给测试类加的 override_settings 配置修改时机晚于视图、节流类的导入时机,修改后的配置没有被已经加载的节流类读取,因此节流规则仍然生效。
解决方法
方案1:临时清空测试目标视图的节流配置(最稳妥,不影响其他测试)
直接修改视图的节流属性,绕开配置加载的缓存问题:
# 先导入你的视图 from 你的应用路径.views import UserQuestionVoteView @override_settings(REST_FRAMEWORK=REST_FRAMEWORK) class TestUserVoteOnOwnQuestion(APITestCase): '''验证用户不能给自己发布的问题投票''' def setUp(self): super().setUp() # 保存原始节流配置 self.original_throttle_classes = UserQuestionVoteView.throttle_classes # 临时清空节流类,完全禁用节流 UserQuestionVoteView.throttle_classes = [] def tearDown(self): # 测试结束后恢复原始配置,避免影响其他测试 UserQuestionVoteView.throttle_classes = self.original_throttle_classes super().tearDown() # 你原来的测试代码保持不变 @classmethod def setUpTestData(cls): cls.user1 = User.objects.create_user("Me", password="topsecretcode") cls.user1_account = UserAccount.objects.create(user=cls.user1) cls.tag = Tag.objects.create(name="Tag") cls.q = mock_questions_submitted[2] cls.q.update({'user_account': cls.user1_account}) cls.question = Question(**cls.q) cls.question.save() cls.question.tags.add(cls.tag) def test_vote_on_own_posted_question(self): self.client.login(username="Me", password="topsecretcode") response = self.client.put( reverse("questions_api:vote", kwargs={'id': 1}), data={"vote": "upvote"} ) self.assertEqual(response.status_code, 400) self.assertEquals( response.data['vote'], "Cannot vote on your own question" )
方案2:显式覆盖限流速率为极大值
不用修改视图属性,直接在配置里把对应限流规则的阈值拉到足够大,测试场景下永远不会触发:
@override_settings(REST_FRAMEWORK={ 'TEST_REQUEST_DEFAULT_FORMAT': 'json', 'DEFAULT_THROTTLE_RATES': { 'voting': '1000000/minute' # 阈值远大于全量测试的请求数 } }) class TestUserVoteOnOwnQuestion(APITestCase): # 测试代码保持不变
方案3:全局测试环境禁用节流
如果所有测试都不需要触发节流,直接在测试专用的配置文件(比如 test_settings.py)中修改全局 DRF 配置:
REST_FRAMEWORK = { 'TEST_REQUEST_DEFAULT_FORMAT': 'json', # 清空所有限流规则,或者单独把需要的阈值拉满 'DEFAULT_THROTTLE_RATES': {} }
内容的提问来源于stack exchange,提问作者binny
相关产品推荐
相关产品推荐

