Django 1.5.1 'ImportError: No module named urls' when running tests
django, django-testing, django-urls, python
Solution
If you created the `urls.py` file outside of app named yoda, then set the
ROOT_URLCONF = 'urls'
if you created `urls.py` in a module then set
ROOT_URLCONF = 'modulename.urls'
Try with this
Problem
I've started project with Django 1.5 I've the following urls, views, and tests of the profile app. When I browse `localhost:8000/profiles` it works just fine but when I run test for profile app `./manage.py test profile` it fails with the following exception ``` File "<stdlib>/site-packages/django/core/urlresolvers.py", line 342, in RegexURLResolver.urlconf_module self = <RegexURLResolver 'yoda.urls' (None:None) ^/> 340 return self._urlconf_module 341 except AttributeError: --> 342 self._urlconf_module = import_module(self.urlconf_name) 343 return self._urlconf_module 344 File "<stdlib>/site-packages/django/utils/importlib.py", line 35, in import_module name = 'yoda.urls' package = None 32 break 33 level += 1 34 name = _resolve_name(name[level:], package, level) ---> 35 __import__(name) 36 return sys.modules[name] ImportError: No module named urls ``` main urls.py ``` from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'', include('profile.urls', namespace='profile')), url(r'^admin/', include(admin.site.urls)), ) ``` profiles app urls ``` from django.conf.urls import patterns, url urlpatterns = patterns('profile.views', url(r'^u/(?P<username>[\-_\.\w\d]+)/$', view='profile_detail', name='detail'), url(r'^profiles/$', view='profile_list', name='list'), ) ``` profile.views ``` from django.shortcuts import render from django.contrib.auth.decorators import login_required from django.db.models.signals import post_save from profile import signals from profile.models import User @login_required def profile_list(request, template='profiles/profile_list.html'): """ Profiles list """ return render(request, template, {'profiles': []}) @login_required def profile_detail(request, username, template='profiles/profile_detail.html'): """ Profile details """ return render(request, template) # Connect signals and senders post_save.connect(signals.user_created, sender=User) ``` profile.tests ``` from django.core.urlresolvers import reverse from django.test import TestCase from profile.tests.factories import UserFactory class UrlsTest(TestCase): """ Testing urls for category application """ def setUp(self): self.user = UserFactory.build() def get(self, url, follow=False): return self.client.get(url, follow=follow) def test_list_profiles(self): """ Page with the list of profiles """ self.client.login(username=self.user.username, password='pass') print(reverse('profile:list')) res = self.get(reverse('profile:list')) self.assertTrue(res.status_code, 200) self.assertTemplateUsed('profile/profile_list.html') ``` settings ``` import os import sys here = lambda * x: os.path.abspath(os.path.join(os.path.abspath(os.path.dirname(__file__)), *x)) PROJECT_NAME = 'yoda' PROJECT_ROOT = here('../..') root = lambda * x: os.path.abspath(os.path.join(os.path.abspath(PROJECT_ROOT), *x)) sys.path.insert(0, root('yoda')) sys.path.insert(0, PROJECT_ROOT) sys.path.insert(0, root('apps')) ... ROOT_URLCONF = 'yoda.urls' ``` What may cause problems like this? In the project with pretty same config and on Django 1.4.5 it works fine. Debugging Django internals Tried to debug Django `django.core.urlresolvers:263`. When `ROOT_URLCONF='yoda.urls'` it fails with the errors show above but I tried `yoda.yoda.urls` and it worked. I'm confused about this problem, still trying to fix. ``` ipdb> __import__('yoda.yoda.urls') <module 'yoda' from '/Users/sultan/.virtualenvs/yoda/yoda/__init__.pyc'> ``` Small update When it receives ROOT_URLCONF from settings we have the following error ``` > /Users/sultan/.virtualenvs/yoda/lib/python2.7/site-packages/django/core/urlresolvers.py(351)url_patterns() 350 def url_patterns(self): --> 351 patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 352 try: ipdb> l 346 self._urlconf_module = import_module(self.urlconf_name) 347 return self._urlconf_module 348 349 @property 350 def url_patterns(self): --> 351 patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 352 try: 353 iter(patterns) 354 except TypeError: 355 raise ImproperlyConfigured("The included urlconf %s doesn't have any patterns in it" % self.urlconf_name) 356 return patterns ipdb> self.urlconf_module *** ImportError: No module named urls ```