如何测试尝试刷新过期 token 的情况?或者试图超过 JWT_REFRESH_EXPIRATION_DELTA
的情况?
我正在寻找最 pythonic/djangotacular 的方式来对 token 刷新端点进行单元测试。 AFAICT,我的端点工作正常 - 它正在刷新 token ,当我通过 python REPL 测试它时,它按照我的预期进行。但由于这是我正在修复的记录错误,所以我想在我的测试工具下完成修复。测试正面案例很容易,但我不确定如何从这里开始。我不想做一些延迟循环或类似的事情,因为那会破坏快速和孤立地运行的整个单元测试思想......
我的测试目前使用 response = self.client.post(...)
风格。
最佳答案
我可以想到两种方法来做你想做的事,都涉及使用 mocks .如果你想做严肃的独立单元测试,你必须学会使用模拟。 ;)
首先,模拟 validate
RefreshJSONWebTokenSerializer
引发 serializers.ValidationError
的方法:
from rest_framework import serializers
@mock.patch('rest_framework_jwt.RefreshJSONWebTokenSerializer.validate')
def test_token_expiry_refresh(self, validate_mock):
validate_mock.side_effect = serializers.ValidationError('Refresh has expired.')
response = self.client.post('/refresh-token-url/')
self.assertEquals(response.status, 400) # I believe it's this code what ValidationError should return
第二个选项有点复杂,意味着使用当前日期时间:
import datetime
# http://stackoverflow.com/a/5437199/356729
class FakeDateTime(datetime):
"A manipulable datetime replacement"
def __new__(cls, *args, **kwargs):
return datetime.__new__(datetime, *args, **kwargs)
@patch('rest_framework_jwt.RefreshJSONWebTokenSerializer.datetime', FakeDateTime)
def test_token_expiry_refresh(self):
FakeDateTime.utcnow = classmethod(lambda cls: datetime.utcnow() + timedelta(0, 10))
response = self.client.post('/refresh-token-url/')
self.assertEquals(response.status, 400)
我更喜欢第一个选项,因为它更容易。
关于python - 单元测试 JWT token 过期 : Django REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28970790/