Python 单元测试JWT令牌存在:Django REST

Python 单元测试JWT令牌存在:Django REST,python,django,unit-testing,django-rest-framework,jwt,Python,Django,Unit Testing,Django Rest Framework,Jwt,如何测试尝试刷新过期令牌的情况?或者试图超过JWT\u REFRESH\u EXPIRATION\u DELTA 我正在寻找最具python/djangotacular风格的方法来对令牌刷新端点进行单元测试。AFAICT,我的端点工作正常,它正在刷新令牌,当我通过python REPL测试它时,它完成了我所期望的。但由于这是我正在修复的一个有文档记录的bug,所以我希望在我的测试工具下进行修复。检测阳性病例很容易,但我不确定如何从这里开始。我不想做一些延迟循环或类似的事情,因为这会破坏整个单元测

如何测试尝试刷新过期令牌的情况?或者试图超过
JWT\u REFRESH\u EXPIRATION\u DELTA

我正在寻找最具python/djangotacular风格的方法来对令牌刷新端点进行单元测试。AFAICT,我的端点工作正常,它正在刷新令牌,当我通过python REPL测试它时,它完成了我所期望的。但由于这是我正在修复的一个有文档记录的bug,所以我希望在我的测试工具下进行修复。检测阳性病例很容易,但我不确定如何从这里开始。我不想做一些延迟循环或类似的事情,因为这会破坏整个单元测试的思想,即快速、孤立地运行


我的测试目前使用的是
response=self.client.post(…)
风格。

我可以想出两种方法来做你想做的事情,并且都涉及使用。如果你想进行严格的独立单元测试,你必须学会使用mock

首先,模拟RefreshJSONWebTokenSerializer的方法来引发序列化程序。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)

我更喜欢第一个选项,因为它更容易。

如何定义validate\u mock fixture?