Изменить лимит страниц в тестовом примере

Короткий вопрос: как переопределить настройку PAGE_SIZE для REST_FRAMEWORK в тестовом примере в Django?

Подробности о вопросе: у меня есть следующие настройки в моем проекте base.py:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'Masterdata.authentication.FashionExchangeAuthentication',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
    ),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 100
}

Теперь я хочу создать тестовый пример, в котором я изменю размер страницы на 10. Однако я не могу переопределить этот конкретный параметр, сохранив остальную часть словаря нетронутой. Кто-нибудь знает, как это сделать?

Вот что я пробовал:

1) Добавление декоратора mod_settings над тестовым методом:

@modify_settings(REST_FRAMEWORK={
    'remove': 'PAGE_SIZE',
    'append': {'PAGE_SIZE': 10}
})

Это не меняет настройки.

2) Использование override_settings в качестве менеджера контекста:

test_settings = settings.REST_FRAMEWORK
test_settings['PAGE_SIZE'] = 10
with override_settings(REST_FRAMEWORK = test_settings):
    # do stuff

Однако строка с test_settings['PAGE_SIZE']=10 не работает, потому что, по-видимому, переменная settings.REST_FRAMEWORK является списком, а не словарем.

print(settings.REST_FRAMEWORK)

['DEFAULT_PERMISSION_CLASSES', 'DEFAULT_AUTHENTICATION_CLASSES', 'DEFAULT_FILTER_BACKENDS', 'DEFAULT_PAGINATION_CLASS', 'DEFAULT_RENDERER_CLASSES']

Почему этот параметр находится здесь в списке? Я убедился, что переменная больше нигде в проекте не перезаписывается.


person physicalattraction    schedule 30.12.2016    source источник
comment
почему бы не добавить еще один файл настроек для теста?   -  person itzMEonTV    schedule 30.12.2016
comment
в ваших настройках вы можете создать условие, проверив sys.argv. если в sys.argv есть «тест», установите для PAGE_SIZE значение 10.   -  person Manasvi Batra    schedule 30.12.2016


Ответы (1)


Под вашими настройками rest_framework вы можете проверить, является ли это тестовой средой. Это должно работать:

if 'test' in sys.argv:
    REST_FRAMEWORK['PAGE_SIZE'] = 10

В противном случае вы можете создать отдельный файл настроек для тестовых случаев:

# settings_tests.py
from settings import *

# Override your changes.
REST_FRAMEWORK['PAGE_SIZE'] = 10
person Manasvi Batra    schedule 30.12.2016
comment
Но тогда он будет обновляться для всех тестов, а не только для того метода, который я хочу. - person physicalattraction; 30.12.2016
comment
Вы можете запустить тестовый пример, для которого вам нужен другой PAGE_SIZE, запустив python manage.py test app.api.test.TestClass, и в вашем sys.argv вы можете проверить, присутствует ли app.api.test.TestClass, а затем установить размер страницы. до 10, иначе вам придется пойти по более простому пути, т.е. создать отдельный файл настроек для тестовых случаев - person Manasvi Batra; 01.01.2017