python - 单元测试 JWT token 过期 : Django REST

标签 python django unit-testing django-rest-framework jwt

如何测试尝试刷新过期 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/

相关文章:

java - 模拟实例触发事件

python - 为多态身份增强 SQLAlchemy 语法

python - 导入 binascii Python 2.5.2

django - 无法通过 Django View 打开作为附件返回的 XLS

java - 如何重新初始化我的 bean

java - 如何指定没有输入的测试用例

python - 在python中访问字典列表中的元素

python - Google Cloud 数据流依赖项

javascript - Django 模板中的 Mustache.js 不起作用

python - 速度比较 : server-generated HTML vs templates?