强迫其危险的URLSafeTimedSerializer给予旧签名

时间:2015-12-02 13:22:42

标签: python unit-testing

为了测试,我想用它的危险签名,但是它已经两天了,所以它会在测试中显示为已过期。有没有办法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

请勿尝试将itsdangerous欺骗为特定行为。改为使用模拟,并让它返回值或根据需要准确引发异常,以便您测试您自己的代码

例如,使用带有过期值的.loads() method会导致SignatureExpired exception被提升。使用mock library模拟可以做同样的事情。

我希望您的代码看起来像这样:

from itsdangerous import URLSafeTimedSerializer

def some_function(signed_value):
    result = URLSafeTimedSerializer(secret).loads(signed_value, max_age=3600)

您可以模拟URLSafeTimedSerializer类,并调用.loads()方法引发相同的异常。此外,您可以断言您的测试代码传递了哪些参数:

import unittest
from mock import patch
from itsdangerous import SignatureExpired

import module_under_test

class ModuleTests(unittest.TestCase):
    @patch('module_under_test.URLSafeTimedSerializer')
    def test_expired_signature(self, serializer_mock):
        instance = serializer_mock.return_value  # what is returned when the mock is called
        instance.loads.side_effect = SignatureExpired

        with self.assertRaises(SignatureExpired):
            module_under_test.some_function('foo_bar')

        serializer_mock.assert_called_with('your_test_secret')
        instance.loads.assert_called_with('foo_bar', max_age=3600)