Django UrlResolver,在运行时添加url进行测试

时间:2011-02-03 21:58:55

标签: django unit-testing url testcase

我正在寻找一些测试,但我还不熟悉URLResolver,但我想快速解决这个问题。

TestCase中,我想向解析程序添加一个网址,以便我可以使用Client.get('/url/')并将其与urls.py分开。

4 个答案:

答案 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
        )