2017-09-16 40 views
2

我正在跟隨使用Python學習Django的TDD網絡開發。它基於Django 1.8,但我試圖在Django 1.11上使用它。自1.8以來似乎有太多變化。我的應用程序(列表)在作者完成之前完全工作,爲我的應用程序創建單獨的urls.py文件。現在,所有的測試都會失敗,並顯示404錯誤。不能包含我的應用程序在Django中的網址

我urls.py是

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')), 
] 

和我的列表/ 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'), 
] 

當我運行這些都是我的測試中,其產生錯誤

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,)) 

發生這些錯誤我的測試,

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 

任何幫助表示讚賞。謝謝!

+0

你需要添加你的測試 –

+0

添加請求的測試,但我不認爲他們是測試出了問題,他們工作的罰款之前,我分開的網址爲我的應用程序 –

回答

5

您可以通過刪除URL模式lists嘗試,因爲你在主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

謝謝爲答案。起初我誤解了你。但是,它現在可以運行thanx –

1

你需要從

.get('/lists/ 

重寫你的測試翻番名單

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

或最佳使用方法reverse ,例如:

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

我的測試很好,我做了一個單獨的urls.py文件。如果您需要保存您的測試,您需要在PRMoureu的答案中執行操作,或者在我的答案中嘗試邏輯,您可以請檢查我是否在主要URL文件 –

+0

中包含正確的包含位。 –

相關問題