Versuchen wir, Debugging und Testen mit Python mit der Blog-App durchzuführen, die in der TODO-Aufgabe von Teil 3 erstellt wurde.
Die URL des App-Codes lautet https://github.com/maeclamar/todo-part3 ist.
Lassen Sie uns mit Pdb debuggen. Informationen zur Verwendung von Pdb finden Sie in diesem Artikel. Öffnen Sie views.py und fügen Sie die Pdb-Importanweisung zu Ihrem Code hinzu.
blogs/views.py
def detail(request, blog_id):
import pdb; pdb.set_trace() #hinzufügen
blog = Blog.objects.get(id=blog_id)
comments = Comment.objects.filter(post=blog)
if request.method == "POST":
form = forms.CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = blog
comment.author = request.user
comment.save()
# form = forms.CommentForm() #Einmal auskommentieren
Füllen Sie in diesem Zustand das Kommentarformular in einem der Artikel aus und senden Sie es ab. Der Kommentar wird dann im Kommentarfeld angezeigt, das Formular behält jedoch das bei, was Sie zuvor eingegeben haben. Debuggen, um die Ursache dieses Problems zu ermitteln.
Starten Sie den Server.
terminal
$ python manage.py runserver
Füllen Sie nach dem Start das Kommentarformular in einem der Blog-Beiträge aus und senden Sie es ab. Dann
terminal
> /Users/Kazuki/todo/django_blog/blogs/views.py(16)detail()
-> blog = Blog.objects.get(id=blog_id)
Wird angezeigt. Wenn Sie hier `` `l``` eingeben,
terminal
> /Users/Kazuki/todo/django_blog/blogs/views.py(16)detail()
-> blog = Blog.objects.get(id=blog_id)
(Pdb) l
14 def detail(request, blog_id):
15 import pdb; pdb.set_trace()
16 -> blog = Blog.objects.get(id=blog_id)
17 comments = Comment.objects.filter(post=blog)
18
19 if request.method == "POST":
20 form = forms.CommentForm(request.POST)
21 if form.is_valid():
Ein Teil des Codes wird mit einem Pfeil in der auszuführenden Zeile angezeigt. Dieses Mal möchte ich sehen, wie das Formular zum Zeitpunkt der Rückkehr in Zeile 29 aussieht, also werde ich in Zeile 29 einen Haltepunkt setzen.
terminal
> /Users/Kazuki/todo/django_blog/blogs/views.py(16)detail()
-> blog = Blog.objects.get(id=blog_id)
(Pdb) b 29
Breakpoint 1 at /Users/kazuki/todo/django_blog/blogs/views.py:29
Fahren Sie sofort mit der 29. Zeile fort.
terminal
(Pdb) c
> /Users/Kazuki/todo/django_blog/blogs/views.py(29)
-> return render(request, 'blogs/detail.html', {'blog': blog, 'form':form, 'comments':comments})
Lassen Sie uns nun den Status des Formulars überprüfen.
terminal
(Pdb) p form
<CommentForm bound=True, valid=Unknown, fields=(text)>
Das `gebunden``` des Formulars ist jetzt`
True```.
Dies bedeutet, dass das Formular Daten enthält, die übermittelt werden können.
Um dies in den Zustand "Falsch" zu versetzen, in der Datei "views.py"
blogs/views.py
# form = forms.CommentForm() #Einmal auskommentieren
Wenn ich einen Satz auskommentiere und das Formular erneut abschicke, behält das Formular nicht das bei, was ich zuvor eingegeben habe. In der Tat, wenn ich versuche zu debuggen
terminal
(Pdb) p form
<CommentForm bound=False, valid=Unknown, fields=(text)>
Wird angezeigt und `bound
ist
`` `False```.
Als nächstes werde ich einen Test für die App schreiben.
blogs/test.py
from django.urls import resolve
from django.test import TestCase
from blogs.views import index, detail, signup
from django.http import HttpRequest
from django.template.loader import render_to_string
#Stellen Sie sicher, dass die entsprechende Ansicht unter jeder URL gestartet wird
class UrlResolveTest(TestCase):
def test_url_resolves_to_index_view(self):
found = resolve('/')
self.assertEqual(found.func, index)
def test_url_resolves_to_detail_view(self):
found = resolve('/detail/3/')
self.assertEqual(found.func, detail)
def test_url_resolves_to_signup_view(self):
found = resolve('/signup/')
#Stellen Sie sicher, dass korrektes HTML zurückgegeben wird
class HtmlTest(TestCase):
def test_index_page_returns_correct_html(self):
request = HttpRequest()
response = index(request)
expected_html = render_to_string('blogs/index.html', {'blogs': []})
self.assertEqual(response.content.decode(), expected_html)
Ich werde es testen.
terminal
$ python manage.py test
Creating test database for alias 'default'...
...
----------------------------------------------------------------------
Ran 4 tests in 0.060s
OK
Destroying test database for alias 'default'...
Ich habe den Test bestanden.