我正在寻找一些测试,但我还不熟悉URLResolver
,但我想快速解决这个问题。
在TestCase
中,我想向解析程序添加一个网址,以便我可以使用Client.get('/url/')
并将其与urls.py
分开。
答案 0 :(得分:32)
自Django 1.8 using of django.test.TestCase.urls
is deprecated以来。您可以改为使用django.test.utils.override_settings
:
from django.test import TestCase
from django.test.utils import override_settings
urlpatterns = [
# custom urlconf
]
@override_settings(ROOT_URLCONF=__name__)
class MyTestCase(TestCase):
pass
override_settings
可以应用于整个班级或特定方法。
答案 1 :(得分:25)
https://docs.djangoproject.com/en/2.1/topics/testing/tools/#urlconf-configuration
在你的测试中:
class TestMyViews(TestCase):
urls = 'myapp.test_urls'
这将使用myapp/test_urls.py
作为ROOT_URLCONF
。
答案 2 :(得分:6)
我知道这是前一段时间被问到的,但我想我会再次回答它,以提供更完整和最新的内容。
您有两种方法可以解决此问题,一种是提供您自己的网址文件,如SystemParadox的回答所示:
class MyTestCase(TestCase):
urls = 'my_app.test_urls'
另一种是修补你的网址。这不是处理覆盖网址的推荐方法,但您可能会遇到仍然需要它的情况。要对单个测试用例执行此操作而不影响其余部分,您应该在setUp()
方法中执行此操作,然后使用tearDown()
方法进行清理。
import my_app.urls
from django.conf.urls import patterns
class MyTestCase(TestCase):
urls = 'my_app.urls'
def setUp(self):
super(MyTestCase, self).setUp()
self.original_urls = my_app.urls.urlpatterns
my_app.urls.urlpatterns += patterns(
'',
(r'^my/test/url/pattern$', my_view),
)
def tearDown(self):
super(MyTestCase, self).tearDown()
my_app.urls.urlpatterns = self.original_urls
请注意,如果省略urls
class属性,则无法使用此功能。这是因为如果您将测试与其他测试用例一起运行,则会缓存网址并且您的猴子修补不会生效。
答案 3 :(得分:1)
无法使用上面的答案运行它。甚至没有override_settings
。
找到了适合我的解决方案。我的用例是编写一些集成测试,以便在需要从应用程序获取URL的地方测试放置/发布方法。
这里的主要提示是使用set_urlconf
的 django.urls
函数,而不是在类中或使用override_settings
覆盖它。
from django.test import TestCase
from django.urls import reverse, set_urlconf
class MyTests(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
set_urlconf('yourapp.urls') # yourapp is the folder where you define your root urlconf.
def test_url_resolving_with_app_urlconf(self):
response = self.client.put(
path=reverse('namespace:to:your:view-name'), data=test_data
)