Essayons de déboguer et de tester à l'aide de Python avec l'application de blog créée dans la tâche TODO de Part3.
L'URL du code de l'application est https://github.com/maeclamar/todo-part3 est.
Déboguons en utilisant Pdb. Pour savoir comment utiliser Pdb, j'ai fait référence à cet article. Ouvrez views.py et ajoutez l'instruction d'importation Pdb à votre code.
blogs/views.py
def detail(request, blog_id):
import pdb; pdb.set_trace() #ajouter à
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() #Commentez une fois
Dans cet état, remplissez le formulaire de commentaire dans l'un des articles et envoyez-le. Le commentaire sera alors reflété dans le champ de commentaire, mais le formulaire conservera ce que vous avez précédemment entré. Déboguez pour détecter la cause de ce problème.
Démarrez le serveur.
terminal
$ python manage.py runserver
Une fois lancé, remplissez le formulaire de commentaire dans l'un des articles du blog et soumettez-le. Puis
terminal
> /Users/Kazuki/todo/django_blog/blogs/views.py(16)detail()
-> blog = Blog.objects.get(id=blog_id)
Est affiché. Si vous entrez `` l '' ici,
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():
Et une partie du code est affichée, avec une flèche sur la ligne à exécuter. Cette fois, je veux voir à quoi ressemble le formulaire au moment du `` retour '' sur la ligne 29, donc je vais définir un point d'arrêt sur la ligne 29.
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
Passez à la 29e ligne à la fois.
terminal
(Pdb) c
> /Users/Kazuki/todo/django_blog/blogs/views.py(29)
-> return render(request, 'blogs/detail.html', {'blog': blog, 'form':form, 'comments':comments})
Vérifions maintenant l'état du formulaire.
terminal
(Pdb) p form
<CommentForm bound=True, valid=Unknown, fields=(text)>
Le lié '' du formulaire est maintenant
Vrai ''.
Cela signifie que le formulaire contient des données qui peuvent être soumises.
Pour mettre cela dans l'état `` False '', dans le fichier views.py,
blogs/views.py
# form = forms.CommentForm() #Commentez une fois
Lorsque je décommente une phrase et que je soumets à nouveau le formulaire, le formulaire ne conserve pas ce que j'ai entré précédemment. En fait, quand j'essaye de déboguer
terminal
(Pdb) p form
<CommentForm bound=False, valid=Unknown, fields=(text)>
Est affiché et
bound '' '' est `` False```.
Ensuite, j'écrirai un test pour l'application.
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
#Vérifiez que la vue correspondante est lancée à chaque URL
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/')
#Vérifiez que le code HTML correct est renvoyé
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)
Je vais le tester.
terminal
$ python manage.py test
Creating test database for alias 'default'...
...
----------------------------------------------------------------------
Ran 4 tests in 0.060s
OK
Destroying test database for alias 'default'...
J'ai réussi l'examen.