繁体   English   中英

单元测试JWT令牌exipiration:Django REST

[英]Unit Testing JWT token exipiration: Django REST

如何测试尝试刷新过期令牌的情况? 或者尝试超过JWT_REFRESH_EXPIRATION_DELTA

我正在寻找用于单元测试令牌刷新端点的最pythonic / djangotacular方法。 AFAICT,我的终端工作正常 - 它正在刷新令牌,当我通过python REPL测试它时,它做了我所期望的。 但由于这是我正在修复的文档错误,我想最终得到我的测试工具下的修复程序。 测试积极的情况很容易,但我不确定如何从这里开始。 我不想做一些延迟循环或类似的东西,因为这会破坏整个单元测试意识形态的快速和孤立运行......

我的测试目前正在使用response = self.client.post(...)样式。

我可以想到两种方法来做你想做的事情,并且都涉及使用模拟 如果要进行严格的隔离单元测试,必须学会使用模拟。 ;)

首先,模拟RefreshJSONWebTokenSerializervalidate方法以引发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)

我更喜欢第一种选择,因为它更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM