2017-09-16 3 views
2

Je suis le développement Web TDD avec Python pour apprendre Django. Il est basé sur Django 1.8 mais j'essaye de le suivre sur Django 1.11. Il semble y avoir trop de changements depuis 1.8. Mon application (listes) fonctionnait parfaitement avant d'être tolod par l'auteur pour faire un fichier urls.py distinct pour mon application. Maintenant, tous les tests échouent avec l'erreur 404.Impossible d'inclure les URL de mon application dans django

mon urls.py est

from django.conf.urls import url, include 
from lists import views as list_views 

urlpatterns = [ 
    url(r'^$', list_views.home_page, name='home'), 
    url(r'^lists/', include('lists.urls')), 
] 

et mes listes/urls.py

from django.conf.urls import url 
from lists import views as list_views 

app_name = 'lists' 
urlpatterns = [ 
    url(r'^lists/(\d+)/$', list_views.view_list, name = 'view_list'), 
    url(r'^lists/(\d+)/add_item$', list_views.add_item, name = 'add_item'), 
    url(r'^lists/new$', list_views.new_list, name = 'new_list'), 
] 

ce sont mes tests qui produisent une erreur

class ListAndItemModelsTest(TestCase): 

    def test_saving_and_retrieving_items(self): 
     list_ = List() 
     list_.save() 

     first_item = Item() 
     first_item.text = 'The first (ever) list item' 
     first_item.list = list_ 
     first_item.save() 

     second_item = Item() 
     second_item.text = 'Item the second' 
     second_item.list = list_ 
     second_item.save() 

     saved_list = List.objects.first() 
     self.assertEqual(saved_list, list_) 

     saved_items = Item.objects.all() 
     self.assertEqual(saved_items.count(), 2) 

     first_saved_item = saved_items[0] 
     second_saved_item = saved_items[1] 
     self.assertEqual(first_saved_item.text, 'The first (ever) list item') 
     self.assertEqual(first_saved_item.list, list_) 
     self.assertEqual(second_saved_item.text, 'Item the second') 
     self.assertEqual(second_saved_item.list, list_) 

class ListViewTest(TestCase): 

    def test_uses_list_template(self): 
     list_ = List.objects.create() 
     response = self.client.get('/lists/%d/' % (list_.id,)) 
     self.assertTemplateUsed(response, 'list.html') 

    def test_displays_only_items_for_that_list(self): 
     correct_list = List.objects.create() 
     Item.objects.create(text = 'itemey 1', list = correct_list) 
     Item.objects.create(text = 'itemey 2', list = correct_list) 

     other_list = List.objects.create() 
     Item.objects.create(text = 'other list item 1', list = other_list) 
     Item.objects.create(text = 'other list item 2', list = other_list) 

     response = self.client.get('/lists/%d/' % (correct_list.id,)) 

     self.assertContains(response, 'itemey 1') 
     self.assertContains(response, 'itemey 2') 
     self.assertNotContains(response, 'other list item 1') 
     self.assertNotContains(response, 'other list item 2') 

    def test_passes_correct_list_to_template(self): 
     other_list = List.objects.create() 
     correct_list = List.objects.create() 
     response = self.client.post('/lists/%d/' % (correct_list.id,)) 
     self.assertEqual(response.context['list'], correct_list) 

class NewListTest(TestCase): 

    def test_saving_a_POST_request(self): 

     response = self.client.post(
       '/lists/new', 
       data = {'item_text': 'A new list item'} 
      ) 

     self.assertEqual(Item.objects.count(), 1) 
     new_item = Item.objects.first() 
     self.assertEqual(new_item.text, 'A new list item') 

    def test_redirects_after_POST(self): 

     response = self.client.post(
       '/lists/new', 
       data = {'item_text': 'A new list item'} 
      ) 

     new_list = List.objects.first() 

     self.assertRedirects(response, '/lists/%d/' % (new_list.id,)) 

class NewItemTest(TestCase): 

    def test_can_save_a_POST_request_to_an_existing_list(self): 
     other_list = List.objects.create() 
     correct_list = List.objects.create() 

     self.client.post(
       '/lists/%d/add_item' % (correct_list.id,), 
       data = {'item_text': 'A new item for an existing list'} 
      ) 

     self.assertEqual(Item.objects.count(), 1) 
     new_item = Item.objects.first() 
     self.assertEqual(new_item.text, 'A new item for an existing list') 
     self.assertEqual(new_item.list, correct_list) 

    def test_redirects_to_list_view(self): 
     other_list = List.objects.create() 
     correct_list = List.objects.create() 

     response = self.client.post(
       '/lists/%d/add_item' % (correct_list.id,), 
       data = {'item_text': 'A new item for an existing list'} 
      ) 

     self.assertRedirects(response, '/lists/%d/' % (correct_list.id,)) 

ces erreurs se produisent lorsque je lance mes tests,

ERROR: test_passes_correct_list_to_template (lists.tests.ListViewTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 78, in test_passes_correct_list_to_template 
    self.assertEqual(response.context['list'], correct_list) 
    File "/home/abhi/.local/lib/python3.5/site-packages/django/template/context.py", line 87, in __getitem__ 
    raise KeyError(key) 
KeyError: 'list' 

====================================================================== 
ERROR: test_redirects_after_POST (lists.tests.NewListTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 102, in test_redirects_after_POST 
    self.assertRedirects(response, '/lists/%d/' % (new_list.id,)) 
AttributeError: 'NoneType' object has no attribute 'id' 

====================================================================== 
FAIL: test_displays_only_items_for_that_list (lists.tests.ListViewTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 69, in test_displays_only_items_for_that_list 
    self.assertContains(response, 'itemey 1') 
    File "/home/abhi/.local/lib/python3.5/site-packages/django/test/testcases.py", line 385, in assertContains 
    response, text, status_code, msg_prefix, html) 
    File "/home/abhi/.local/lib/python3.5/site-packages/django/test/testcases.py", line 357, in _assert_contains 
    " (expected %d)" % (response.status_code, status_code) 
AssertionError: 404 != 200 : Couldn't retrieve content: Response code was 404 (expected 200) 

====================================================================== 
FAIL: test_uses_list_template (lists.tests.ListViewTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 56, in test_uses_list_template 
    self.assertTemplateUsed(response, 'list.html') 
    File "/home/abhi/.local/lib/python3.5/site-packages/django/test/testcases.py", line 578, in assertTemplateUsed 
    self.fail(msg_prefix + "No templates used to render the response") 
AssertionError: No templates used to render the response 

====================================================================== 
FAIL: test_can_save_a_POST_request_to_an_existing_list (lists.tests.NewItemTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 115, in test_can_save_a_POST_request_to_an_existing_list 
    self.assertEqual(Item.objects.count(), 1) 
AssertionError: 0 != 1 

====================================================================== 
FAIL: test_redirects_to_list_view (lists.tests.NewItemTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 129, in test_redirects_to_list_view 
    self.assertRedirects(response, '/lists/%d/' % (correct_list.id,)) 
    File "/home/abhi/.local/lib/python3.5/site-packages/django/test/testcases.py", line 294, in assertRedirects 
    % (response.status_code, status_code) 
AssertionError: 404 != 302 : Response didn't redirect as expected: Response code was 404 (expected 302) 

====================================================================== 
FAIL: test_saving_a_POST_request (lists.tests.NewListTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/abhi/Development/DjangoDev/superlists/lists/tests.py", line 89, in test_saving_a_POST_request 
    self.assertEqual(Item.objects.count(), 1) 
AssertionError: 0 != 1 

toute aide est appréciée. Je vous remercie!

+0

vous devez ajouter vos tests –

+0

ont ajouté les tests demandés, mais je ne pense pas que leur est un problème avec les tests, ils travaillaient bien avant que je séparé les urls pour mon application –

Répondre

5

Vous pouvez essayer en supprimant le lists dans les modèles d'URL, comme vous le fournir dans la principale urls.py:

urlpatterns = [ 
    url(r'^(\d+)/$', list_views.view_list, name = 'view_list'), 
    url(r'^(\d+)/add_item$', list_views.add_item, name = 'add_item'), 
    url(r'^new$', list_views.new_list, name = 'new_list'), 
] 
+1

Merci pour la réponse. Je vous ai mal compris au début. Mais, ça marche maintenant thanx –

1

vous devez remplacer vos tests de

.get('/lists/ 

doubler les listes

.get('/lists/lists/ 
#   ^^^^^^ 

ou la meilleure façon d'utiliser reverse , Par exemple:

from django.urls import reverse 
# Some your code 
# instead of response = self.client.get('/lists/%d/' % (list_.id,)) 
url = reverse('lists:view_list', args=[list_.id]) 
response = self.client.get(url) 
+0

Mes tests étaient bien avant de faire un fichier urls.py distinct. Pouvez-vous s'il vous plaît vérifier si je fais l'include bit correct dans le fichier urls principal –

+0

si vous devez enregistrer votre test tel quel, vous devez faire des actions dans la réponse de PRMoureu, d'une autre manière essayez la logique dans la réponse –