Opmerkingen testen op een Wagtail-pagina met Factory Boy

Deze tutorial test commentaren gemaakt met behulp van het pakket Django Comments Xtd op een Wagtail-pagina, met behulp van Factory Boy.

15 juli 2020 14:07
Thema's: Testen

Ons uitgangspunt is een commentaarfunctie en een testopstelling voor Wagtail pagina's met Factory Boy. Net als in de eerdere tutorials maken we een comment factory aan in /tests/factories.py. Omdat we ook een gebruiker willen opslaan bij onze opmerkingen, beginnen we met het creëren van een gebruikersfabriek:

import factory
from userauth.models import CustomUser

class CustomUserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = CustomUser

    username = factory.Sequence(lambda n: 'Username{0}'.format(n))
    password = factory.Sequence(lambda n: 'Password{0}'.format(n))

We genereren automatisch een gebruikersnaam en wachtwoord omdat dat het minimum is dat Django verwacht. Merk op dat we bij onze authenticatie-implementatie e-mail gebruiken in plaats van gebruikersnaam, maar dit wordt beheerd door allauth, en aangezien we de aanmeldingsfunctionaliteit van allauth niet gebruiken, moeten we dit zelf regelen. Nu zijn we klaar om een commentaarfabriek te maken:

from ..models import ArticlePage, CustomComment
from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.models import Site as DjangoSite

class CustomCommentFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = CustomComment

    content_type = ContentType.objects.get_for_model(ArticlePage)
    site = DjangoSite.objects.get_current()
    page = factory.SubFactory(ArticlePageFactory)
    user = factory.SubFactory(CustomUserFactory)
    comment = factory.Sequence(lambda n: 'Comment {0}'.format(n))

Als we naar het model voor opmerkingen kijken, hebben we drie verplichte velden nodig: content_type, site en object_pk. Onze opmerkingen komen op een ArticlePage, dus we kunnen het contenttype ophalen met de Django-methode get_for_model(). De huidige site kan worden opgehaald met de Django-methode get_current(). We hernoemen de Site-klasse om verwarring met de Wagtail Site-klasse te voorkomen. Het derde vereiste veld object_pk wordt gedefinieerd bij het maken van de opmerking-instantie. page en user zijn twee foreign key-relaties van de opmerking, dus gebruiken we een SubFactory voor hen. En tot slot voor de commentaartekst zelf genereren we een tekst met Sequence.

We kunnen een paar Wagtail-pagina's klaarzetten, net zoals we eerder hebben gedaan. Zet het volgende in een bestand /tests/test_comments.py:

from .factories import HomePageFactory, ArticlePageFactory, ArticleIndexPageFactory
from django.test import TestCase
from wagtail.core.models import Page, Site

class TestComments(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.site = Site.objects.create(is_default_site=True, root_page=Page.get_first_root_node())
        cls.homepage = HomePageFactory()
        cls.articleindexpage = ArticleIndexPageFactory(parent=cls.homepage)
        cls.articlepage1 = ArticlePageFactory(parent=cls.articleindexpage)

Nu voegen we een gebruiker en een opmerking van die gebruiker toe aan de setup:

from .factories import CustomUserFactory, CustomCommentFactory

cls.user = CustomUserFactory(email="johndoe@example.com", display_name="John")
cls.customcomment = CustomCommentFactory(object_pk=str(cls.articlepage1.pk), user=cls.user)

De velden voor de gebruiker spreken voor zich. Voor de opmerking, zoals eerder vermeld, definiëren we nu de object_pk: we stellen deze in op de primaire sleutel van de pagina waarop we de opmerking willen hebben. Aangezien Django Comments het veld definieert als een tekstveld, converteren we eerst de primaire sleutel. Dat voltooit de installatie. De test zelf is nu heel eenvoudig. Het interessante deel van het te testen model is de methode save(), en aangezien de opmerking al is gemaakt, heeft deze zijn werk al gedaan. We controleren dus gewoon of de pagina en de gebruiker correct zijn opgeslagen:

def test_custom_comment_gets_saved_correctly(self):
    self.assertEqual(self.customcomment.page.url, self.articlepage1.url)
    self.assertEqual(self.customcomment.user_name, self.user.display_name)

We laten het daarbij. Onze dekking controleren met

coverage run --source=cms manage.py test cms.tests
coverage html

vertelt ons dat het grootste deel van onze ongedekte code in onze streamforms zit, dus daar gaan we nu naartoe.

Reageer op dit artikel (log eerst in of bevestig hieronder met naam en email)