我正在做一些测试,但我还不太熟悉,URLResolver
但我想快速解决这个问题。
在 aTestCase
中,我想向解析器添加一个 URL,以便我可以使用Client.get('/url/')
它并将其与urls.py
.
我正在做一些测试,但我还不太熟悉,URLResolver
但我想快速解决这个问题。
在 aTestCase
中,我想向解析器添加一个 URL,以便我可以使用Client.get('/url/')
它并将其与urls.py
.
由于 Django 1.8不推荐使用 ofdjango.test.TestCase.urls
。您可以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
可以应用于整个类或特定方法。
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
.
我知道这是不久前提出的,但我想我会再次回答它以提供更完整和最新的东西。
您有两种选择来解决这个问题,一种是提供您自己的 urls 文件,正如 SystemParadox 的回答所建议的那样:
class MyTestCase(TestCase):
urls = 'my_app.test_urls'
另一种是猴子修补你的网址。这不是处理覆盖 url 的推荐方法,但您可能会遇到仍然需要它的情况。要在不影响其余测试用例的情况下对单个测试用例执行此操作,您应该在您的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 属性,这将不起作用。这是因为 URL 将被缓存,如果您与其他测试用例一起运行测试,您的猴子补丁将不会生效。
无法使用上面的答案运行它。甚至没有override_settings
。找到了一个适合我的解决方案。我的用例是编写一些集成测试,我想在我需要应用程序中的 url 的地方测试 put/post 方法。
这里的主要线索是使用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
)