Opened 12 years ago
Closed 12 years ago
#21766 closed Bug (invalid)
Can't use reverse() or is_valid_path() with dynamically set TestCase.urls
| Reported by: | paulmelnikow | Owned by: | nobody |
|---|---|---|---|
| Component: | Uncategorized | Version: | 1.6 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I'm writing a component and need to override urls in a TestCase. This works fine if I set urls to a string with a module name, but the common middleware raises an exception if I specify a set of patterns.
Traceback (most recent call last):
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/test/utils.py", line 249, in inner
return test_func(*args, **kwargs)
File "/Users/pnm/code/django-url-bug/tests.py", line 26, in test_hello_2
resp = self.client.get('/hello')
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/test/client.py", line 473, in get
response = super(Client, self).get(path, data=data, **extra)
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/test/client.py", line 280, in get
return self.request(**r)
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/test/client.py", line 426, in request
response = self.handler(environ)
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/test/client.py", line 109, in __call__
response = self.get_response(request)
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 196, in get_response
response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 90, in get_response
response = middleware_method(request)
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/middleware/common.py", line 71, in process_request
if (not urlresolvers.is_valid_path(request.path_info, urlconf) and
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/core/urlresolvers.py", line 573, in is_valid_path
resolve(path, urlconf)
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/core/urlresolvers.py", line 453, in resolve
return get_resolver(urlconf).resolve(path)
File "/Users/pnm/code/django-url-bug/venv/lib/python2.7/site-packages/django/utils/functional.py", line 30, in wrapper
if mem_args in cache:
TypeError: unhashable type: 'list'
If the patterns end with slashes, or if APPEND_SLASH is False, the problem goes away.
Here's code with a test example. In the test below, test_hello_2 fails with the stack trace above. test_hello_1 and test_hello_3 pass.
from django.test import TestCase from django.test.utils import override_settings def view_func(r): from django.http import HttpResponse return HttpResponse('Hello, World!') class UrlTestOverriddenExplicit(TestCase): from django.conf.urls import patterns, url urls = patterns('', url(r'^hello/$', view_func), ) def test_hello_1(self): resp = self.client.get('/hello/') self.assertEquals(resp.status_code, 200) class UrlTestOverriddenExplicitWithoutSlash(TestCase): from django.conf.urls import patterns, url urls = patterns('', url(r'^hello$', view_func), ) def test_hello_2(self): resp = self.client.get('/hello') self.assertEquals(resp.status_code, 200) @override_settings(APPEND_SLASH=False) def test_hello_3(self): resp = self.client.get('/hello') self.assertEquals(resp.status_code, 200)
Change History (2)
comment:1 by , 12 years ago
| Summary: | Exception with dynamic TestCase.urls and settings.APPEND_SLASH=True → Can't use reverse() or is_valid_path() with dynamically set TestCase.urls |
|---|
comment:2 by , 12 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
Hi,
The problem is that django.test.TestCase.urls is supposed to be a string pointing to the URLconf module, not a list of patterns.
This is documented there: https://docs.djangoproject.com/en/1.6/topics/testing/tools/#django.test.SimpleTestCase.urls
Though I agree that the documentation is not completely clear, it does say that this attribute should be like settings.ROOT_URLCONF which is itself clearly documented as being a string.
Consequently, I'll close this ticket as invalid.
Feel free to reopen it if, for example, you have suggestions for how to improve the documentation or if you think this should be a new feature.
Thanks.
This issue also seems to affect
reverse()as well asis_valid_path(). To test views which requirereverse(), setting APPEND_SLASH=False won't work, so I put the urlconf into the test module instead.