基于设置的Django Pytest测试URL

2024-03-29 11:45:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django中有一个端点/docs,我只想在设置中的DEBUG = True时可见,否则它应该抛出404。我的设置是这样的

在网址.py在

urlpatterns = ...

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

但是,在进行测试时,django不会自动重新加载urls.py,这意味着简单地将DEBUG重写为True或{}无法工作。在

我的测试看起来像这样

^{pr2}$

现在奇怪的是:当我使用pytest path/to/test.py::APIDocsTestWithDebugpytest path/to/test.py::APIDocsTestWithoutDebug分别运行测试时,两个测试都通过了。但是,如果我将测试文件作为一个整体运行(pytest path/to/test.py),APIDocsTestWithDebug总是失败。它们单独工作而不是一起工作这一事实告诉我,url覆盖是有效的,但是当测试串联起来时,会有一些bug把事情搞砸。我想知道是否有人遇到过类似的问题,要么有完全不同的解决方案,要么能给我一些提示,说明我做错了什么。在


Tags: topathdjangopydebugtesttrueurl
1条回答
网友
1楼 · 发布于 2024-03-29 11:45:42

我为同样的问题而挣扎。问题是Django在初始化时加载urlpatterns一次,并且用修饰符重写设置不会更改最初加载的内容。在

以下是对我有效的方法-尝试在失败的测试用例之前重新加载urls模块(基于this)并用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。在

相关问题 更多 >