Djangoラーニングシリーズ15:POSTリクエストのデータをデータベースに格納する
7152 ワード
トップページのPOSTリクエストに対するテストを修正します.ビューは、応答に直接送信するのではなく、新しく追加された待機事項をデータベースに格納します.
この操作をテストするには、既存のテスト方法test_can_save_a_post_requestに3行の新しいコードを追加
コード解析:
1、新しいItemオブジェクトをデータベースに保存するかどうかをチェックします.objects.count()はobjectsです.all().count()の略記形式
2、objects.first()はobjectsに等しい.all()[0]
3、待機事項のテキストが正しいかどうかをチェックします.
テストの再実行
ビューを変更
ユニットテストは...合格しました.
前のコードを見てみると、明らかな問題や注意が必要かもしれません.
1、要求ごとに空白の保留事項を保存しない
2、post要求のテストが長すぎる
3、表に複数の未処理項目を表示する
4、複数のリストをサポートする!
コード再構築
解決ユニットテストは一度に1つだけテストし、既存のコードに断言を追加し、新しいテスト方法を定義します.
このテストはAssertionError:1!=0失敗
次にこの問題を修正し,ビュー関数に対する論理的変更幅は小さいが,コード実装方式には微細な変動があることに注意する.
コード解析:
#1使用名new_item_textの変数で、その値はPOSTリクエストのデータ、または空の文字列です.
#2 .objects.create()は、呼び出しを必要とせずに新しいItemオブジェクトを作成する簡略化された方法である.save()メソッド.
再構築してテストに合格しました
この操作をテストするには、既存のテスト方法test_can_save_a_post_requestに3行の新しいコードを追加
# 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) # 1
new_item = Item.objects.first() # 2
self.assertEqual(new_item.text, 'A new list item') # 3
self.assertIn('A new list item', response.content.decode())
self.assertTemplateUsed(response, 'home.html')
コード解析:
1、新しいItemオブジェクトをデータベースに保存するかどうかをチェックします.objects.count()はobjectsです.all().count()の略記形式
2、objects.first()はobjectsに等しい.all()[0]
3、待機事項のテキストが正しいかどうかをチェックします.
テストの再実行
self.assertEqual(Item.objects.count(), 1) # 1
AssertionError: 0 != 1
ビューを変更
from django.shortcuts import render
from lists.models import Item
from django.http import HttpResponse
# Create your views here.
def home_page(request):
item = Item()
item.text = request.POST.get('item_text', '')
item.save()
return render(request, 'home.html', {
'new_item_text': request.POST.get('item_text', ''),
})
ユニットテストは...合格しました.
前のコードを見てみると、明らかな問題や注意が必要かもしれません.
1、要求ごとに空白の保留事項を保存しない
2、post要求のテストが長すぎる
3、表に複数の未処理項目を表示する
4、複数のリストをサポートする!
コード再構築
解決ユニットテストは一度に1つだけテストし、既存のコードに断言を追加し、新しいテスト方法を定義します.
# lists/tests.py
class HomePageTest(TestCase):
【……】
def test_only_saves_items_when_necessary(self):
self.client.get('/')
self.assertEqual(Item.objects.count(), 0)
このテストはAssertionError:1!=0失敗
次にこの問題を修正し,ビュー関数に対する論理的変更幅は小さいが,コード実装方式には微細な変動があることに注意する.
from django.shortcuts import render
from lists.models import Item
from django.http import HttpResponse
# Create your views here.
def home_page(request):
if request.method == 'POST':
new_item_text = request.POST['item_text'] # 1
Item.objects.create(text=new_item_text) # 2
else:
new_item_text = '' # 1
return render(request, 'home.html', {
'new_item_text': new_item_text, # 1
})
コード解析:
#1使用名new_item_textの変数で、その値はPOSTリクエストのデータ、または空の文字列です.
#2 .objects.create()は、呼び出しを必要とせずに新しいItemオブジェクトを作成する簡略化された方法である.save()メソッド.
再構築してテストに合格しました