1

問題簡而言之:在Django的測試用例中,如何覆蓋的PAGE_SIZE設置?有關問題更改測試用例中的頁面限制

詳細信息:我在我的項目的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)添加modify_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'] 

這是怎麼設置的?我已經驗證該變量不會覆蓋項目中的其他任何地方。

+0

爲什麼不添加一個設置文件的測試? – itzMEonTV

+0

在您的設置中,您可以通過檢查sys.argv來創建條件。如果sys.argv在其中有'test',那麼將PAGE_SIZE設置爲10 –

回答

0

在您的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 
+0

但是,它將被更新爲* all *測試,而不僅僅是我想要的方法。 – physicalattraction

+0

你可以通過運行「python manage.py test app.api.test.TestClass」運行你想要不同PAGE_SIZE的測試用例,並且在你的sys.argv中你可以檢查「app.api.test.TestClass」是否爲然後設置頁面大小爲10,否則你將不得不採取更簡單的方式,即爲測試用例創建一個單獨的設置文件 –