基于设置的Django Pytest测试URL

mjk*_*fer 2 python django pytest urlconf

/docs在django中有一个端点,我只想DEBUG = True在设置中可见- 否则,它应该抛出404.我的设置看起来像这样

urls.py

urlpatterns = ...

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

在做测试,不过,Django不自动重新加载urls.py,这意味着简单地覆盖DEBUGTrueFalse不能正常工作.

我的测试看起来像这样

@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
    ...
Run Code Online (Sandbox Code Playgroud)

现在这里是奇怪的部分:当我使用pytest path/to/test.py::APIDocsTestWithDebug和单独运行测试时pytest path/to/test.py::APIDocsTestWithoutDebug,两个测试都通过了.但是,如果我将测试文件作为一个整体运行(pytest path/to/test.py),则APIDocsTestWithDebug总是失败.它们单独工作但不能一起工作的事实告诉我,url覆盖是有效的,但是当测试串联时,有一些错误会让事情变得混乱.我想知道是否有人遇到过类似的问题,或者有一个完全不同的解决方案,或者可以给我一些关于我做错的提示.

Ser*_*rov 5

我在同样的问题上挣扎.问题是Django urlpatterns在初始化时加载了你的一次 - 并且用装饰器覆盖设置并不会改变最初加载的内容.

这对我有用 - 尝试重新加载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)
Run Code Online (Sandbox Code Playgroud)

PS:您可能还想稍后恢复urlpatterns - 只需reload_urlconf在其他内部运行settings.

  • 谢谢你,很好的答案。 (2认同)