覆盖Django设置不会反映在测试中

时间:2019-04-10 19:00:51

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

我有一个单独的settings文件用于测试环境。我正在使用DRF进行身份验证,但是在rest_framework.permissions.AllowAny文件中将默认权限设置为test_setting。现在要测试身份验证是否有效,我需要覆盖密钥。但这似乎不起作用。

我正在使用装饰器@override_settings。但这似乎不起作用。 如果我直接更改setttings文件,则测试通过。

@override_settings(REST_FRAMEWORK={
    'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
            'rest_framework.permissions.IsAuthenticated',
    )
})
class AuthenticationTest(TestCase):

    def test_api_should_not_be_hit_without_authorization(self):
        response = client.get(reverse('some_api', kwargs={'key': value}))
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)

我期望状态码为401,但似乎可以通过,并给我200。 我在测试中粘贴了以下代码,它显示REST FRAMEWORK实际上已被覆盖,但是测试仍然失败。

from django.conf import settings
        dir(settings)
        print(settings.REST_FRAMEWORK)

编辑:

这是我得到的答复: <Response status_code=200, "application/json">

谢谢

1 个答案:

答案 0 :(得分:0)

在以经过身份验证的用户测试DRF端点之前,我曾发生过这种情况。如果用户有权访问DRF browseable API视图,则导致401的API请求仍可以在有效的API视图中表示。

尝试将format='json'添加到client.get()中,以确保您未点击DRF接口而不是JSON API:

response = client.get(reverse('some_api', kwargs={'key': value}), format='json')

您可以change the default API request format而不是在client.get()中指定API格式,而是可以在测试设置模块中将其用于所有测试请求:

REST_FRAMEWORK = {
    ...
    'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}