36

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

在 aTestCase中,我想向解析器添加一个 URL,以便我可以使用Client.get('/url/')它并将其与urls.py.

4

4 回答 4

48

由于 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可以应用于整个类或特定方法。

于 2015-08-05T16:27:35.127 回答
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.

于 2011-11-09T09:52:19.560 回答
7

我知道这是不久前提出的,但我想我会再次回答它以提供更完整和最新的东西。

您有两种选择来解决这个问题,一种是提供您自己的 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 将被缓存,如果您与其他测试用例一起运行测试,您的猴子补丁将不会生效。

于 2013-12-05T16:12:00.953 回答
1

无法使用上面的答案运行它。甚至没有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
        )
于 2019-02-12T10:08:15.810 回答