簡體   English   中英

基於設置的 Django Pytest 測試 URL

[英]Django Pytest Test URL Based on Settings

我在 django 中有一個端點/docs ,我只想在設置中的DEBUG = True時可見 - 否則,它應該拋出 404。我的設置看起來像這樣

網址.py

urlpatterns = ...

if settings.DEBUG:
    urlpatterns += [
            url(r'^docs/$', SwaggerSchemaView.as_view(), name='api_docs'),
    ]

但是,在進行測試時,django 不會自動重新加載urls.py ,這意味着簡單地將DEBUG覆蓋為TrueFalse是行不通的。

我的測試看起來像這樣

@override_settings(DEBUG=True)
@override_settings(ROOT_URLCONF='config.urls')
class APIDocsTestWithDebug(APITestCase):
    # check for 200s
    ...

@override_settings(DEBUG=False)
@override_settings(ROOT_URLCONF='config.urls')
class APIDocsTestWithoutDebug(APITestCase):
    # check for 404s
    ...

現在是奇怪的部分:當我使用pytest path/to/test.py::APIDocsTestWithDebugpytest path/to/test.py::APIDocsTestWithoutDebug單獨運行測試時,兩個測試都通過了。 但是,如果我將測試文件作為一個整體運行( pytest path/to/test.py ), APIDocsTestWithDebug總是失敗。 他們單獨工作而不是一起工作的事實告訴我url 覆蓋正在工作,但是當測試串聯時,有一些錯誤會搞砸。 我想知道是否有人遇到過類似的問題,或者有一個完全不同的解決方案,或者可以給我一些關於我做錯了什么的提示。

我在同樣的問題上掙扎。 問題是 Django 在初始化時會加載一次您的urlpatterns - 並且使用裝飾器覆蓋設置不會更改最初加載的內容。

這是對我clear_url_caches() - 嘗試重新加載您的urls模塊(基於)並在失敗的測試用例之前使用clear_url_caches()清除 url 緩存:

import sys

from importlib import reload, import_module

from django.conf import settings
from django.core.urlresolvers import clear_url_caches

def reload_urlconf(urlconf=None):
    clear_url_caches()
    if urlconf is None:
        urlconf = settings.ROOT_URLCONF
    if urlconf in sys.modules:
        reload(sys.modules[urlconf])
    else:
        import_module(urlconf)

PS:您可能還想稍后恢復 urlpatterns - 只需在其他settings運行reload_urlconf

您可以使用@pytest.mark.urlshttps : @pytest.mark.urls

@pytest.mark.urls('myapp.test_urls')
def test_something(client):
    assert 'Success!' in client.get('/some_url_defined_in_test_urls/').content

您甚至可以在同一個文件中定義 URL:

def some_view(request):
    return HttpResponse(b"Success!")


urlpatterns = [
    path("some-url/", some_view)
]


@pytest.mark.urls(__name__)
def test_something(client):
    assert b'Success!' in client.get('/some-url/').content

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM