處理完POST請求后重定向
代碼中new_item_text = ''的寫法不怎么樣。解決第二個問題時候,順帶把這個問題也解決了。
人們都說處理完post請求后一定要重定向,接下來就實現這個功能吧。修改針對保存POST請求數據的單元測試,不讓它渲染包含待辦事項的響應,而是重定向到首頁。
lists/tests.py
def test_can_save_a_post_request(self): response = self.client.post('/', 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') self.assertEqual(response.status_code, 302) self.assertEqual(response['location'], '/')
不需要再拿響應中的.content 屬性值和渲染模板得到的結果比較,因此把相應的斷言刪掉了。現在,響應是HTTP重定向,狀態碼是302,讓瀏覽器指向一個新地址。修改之后運行結果200!=302,現在可以大幅度清理視圖函數了
from django.shortcuts import render, redirect from lists.models import Item from django.http import HttpResponse # Create your views here.在這兒編寫視圖 def home_page(request): if request.method == 'POST': Item.objects.create(text=request.POST['item_text']) return redirect('/') return render(request,'home.html')
現在測試可以通過了python manage.py test
---------------------------------------------------------------------- Ran 5 tests in 0.012s OK Destroying test database for alias 'default'...
更好的單元測試實踐方法,一個測試只測試一件事
單元測試實踐方法要求,一個測試只能測試一件事,因為這樣便於查找問題。如果一個測試中有多個斷言,一旦前面的斷言導致失敗,就無法得知后面的斷言情況如何(如,如果不小心破壞了視圖函數,我們想知道到底是保存對象時出錯了,還是響應的類型出錯了)
剛開始可能無法寫出只有一個斷言的完美單元測試,不過現在可以把正在開發的功能分開測試(上面一個功能分為兩個)。
#lists/tests.py
def test_can_save_a_post_request(self): response = self.client.post('/', 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('/', data={'item_text': 'A new list item'}) self.assertEqual(response.status_code, 302) self.assertEqual(response['location'], '/')
現在運行應該看見有六個測試通過,而不是五個。
---------------------------------------------------------------------- Ran 6 tests in 0.014s OK Destroying test database for alias 'default'...
