Problème pour l'écriture d'un test pour une vue
Bonjour je souhaiterai écrire un test d'intégration pour cette fonction de vue :
def post_list_view(request):
"""Display the list of all published post"""
post_list = Post.published.all()
paginator = Paginator(post_list, 6)
page_number = request.GET.get("page", 1)
try:
posts = paginator.page(page_number)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
except PageNotAnInteger:
posts = paginator.page(1)
return render(request, "blog/list.html", {"posts": posts})
Je veux tester que j'ai bien uniquement 3 posts par page.J'ai écrit ce test là :
@pytest.mark.django_db
def test_post_list_view_pagination_systeme(client):
"""Check if there are the right number of posts in the page"""
author = get_user_model().objects.create_user(username="testuser", password="password")
for i in range(7):
post = Post.objects.create(
title=f"Post {i}",
slug=f"post_slug_test_{i}",
author=author,
body=f"body_test_{i}",
status=Post.Status.PUBLISHED,
)
url = reverse("blog:post_list") + "?page=1"
response = client.get(url)
assert "Post 0" in str(response.content)
Mon test échoue alors que lorsque je fais un print de response.content j'ai tout le code HTML qui apparait et je retrouve bien "Post 0" dans ce print.Voila mon dépot : https://gitlab.com/django-web2/django-blog.git
Salut Flavien !
Alors si je comprends bien, tu crées des articles de test dans ta boucle ? Si c'est le cas, il serait plus judicieux de créer une fixture pour séparer le setup de ton test.
Et du coup il me semble que le problème vient de ton test qui se trouve directement à l'intérieur de ta boucle et non pas à la fin de celle-ci.
Merci pour ta réponse, et désolé pour le délai. J'ai modifié mon test à ça :
@pytest.mark.django_db
def test_post_list_view_pagination_systeme(client):
"""Check if there are the right number of posts in the page"""
author = get_user_model().objects.create_user(username="testuser", password="password")
for i in range(7):
post = Post.objects.create(
title=f"Post {i}",
slug=f"post_slug_test_{i}",
author=author,
body=f"body_test_{i}",
status=Post.Status.PUBLISHED,
)
url = reverse("blog:post_list") + "?page=1"
response = client.get(url)
assert "Post 0" in str(response.content)
assert "Post 1" in str(response.content)
assert "Post 2" in str(response.content)
assert "Post 3" in str(response.content)
assert "Post 4" in str(response.content)
assert "Post 5" in str(response.content)
assert "Post 6" not in str(response.content)
Il se trouve que mon Post 6 se retouve dans la response.content alors que sur mon site le système d epagination fonctionne très bien, je ne comprends pas pourquoi il se retoruve dans la response.content.
Salut Flavien et désolé à mon tour pour le délai de réponse.
La première chose que je vérifierai c'est si le "Post 6" n'est pas présent ailleurs que tu le soupçonne. Ce que je veux dire par là c'est que peut-être que la chaîne de caractères "Post 6" se retrouve à un autre endroit que la pagination dans ta page, ce qui fait que le test passe.
Es-tu sûr que le Post 6 qui est trouvé est bien celui de ta pagination ? Tu peux vérifier dans le contenu de response.content pour voir où il se trouve.
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte