Тест Factory Boy с Wagtail не пройден: TypeError: Поле 'id' ожидало число, но получило {} - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь настроить Factory Boy для сайта Wagtail. Чтобы это работало, метод _create должен иметь возможность установить sh отношения родитель-ребенок между страницами. Я переопределяю метод _create, как описано в документации: https://factoryboy.readthedocs.io/en/latest/reference.html#attributes -and-method . Но добавление «родительского» ключа вызывает ошибку.

Давно искал его, копался в исходных файлах. Я подозреваю, что это связано с тем, как метод model_class пропускает kwargs, но я полагаю, что я до сих пор не замечаю никаких очевидных ошибок. Любая помощь будет принята с благодарностью!

models.py:

from wagtail.core.models import Page

class HomePage(Page):
    pass

class SubjectPage(Page):
    pass

tests.py:

from .factories import HomePageFactory, SubjectPageFactory
from django.test import TestCase

class TestModels(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.homepage = HomePageFactory(title='Test page')
        cls.subjectpage = SubjectPageFactory(parent=cls.homepage)

    def test_dummy(self):
        self.assertTrue(True)

factories.py:

import factory
from .models import HomePage, SubjectPage
from wagtail.core.models import Page


class PageFactory(factory.django.DjangoModelFactory):
    class Meta:
        abstract = True

    @classmethod
    def _create(cls, model_class, *args, **kwargs):

        try:
            parent = kwargs.pop('parent')
            page = model_class(*args, kwargs)
        except KeyError:
            parent = Page.get_first_root_node()
            page = model_class(*args, **kwargs)

        parent.add_child(instance=page)

        return page


class HomePageFactory(PageFactory):
    class Meta:
        model = HomePage


class SubjectPageFactory(PageFactory):
    class Meta:
        model = SubjectPage

1 Ответ

1 голос
/ 01 апреля 2020

Могу ли я порекомендовать wagtail_factories https://github.com/mvantellingen/wagtail-factories?

Для настройки: pip install wagtail-factories

in factories.py

import wagtail_factories

from .models import HomePage, SubjectPage

class HomePageFactory(wagtail_factories.PageFactory):
    class Meta:
        model = HomePage

class SubjectPageFactory(wagtail_factories.PageFactory):
    class Meta:
        model = SubjectPage

in tests.py

from django.test import TestCase


class PagesTestCase(TestCase):
    def test_create(self):
        instance = HomePageFactory.create()
        self.assertIsNotNone(instance.pk)

Если вы хотите протестировать страницы с некоторой структурой, приведенный ниже код создаст домашнюю страницу как root сайта и создаст тему как дочернюю для домашняя страница.

from wagtail.core.models import Site
from .factories import HomePageFactory, SubjectPageFactory

class PageTestCase(TestCase):
    def setUp(self):
        self.homepage = HomePageFactory.create()
        self.site = Site.objects.all().first()
        self.site.root_page = self.homepage
        self.site.save()
        self.site.refresh_from_db()
        self.subject_page = SubjectPageFactory.create(parent=self.homepage)
...