Deze tutorial test commentaren gemaakt met behulp van het pakket Django Comments Xtd op een Wagtail-pagina, met behulp van Factory Boy.
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)