Как сделать PyTest, Mixer, Django, OneToOneField - PullRequest
0 голосов
/ 05 февраля 2020

Как предлагается в большинстве Django учебных пособий, я создал собственную модель пользователя с помощью AbstractUser, а также создал Profile -модель с дополнительными деталями, такими как био, которое связано с User через OneToOneField.

Теперь я начинаю писать тесты, и я не уверен, как ссылаться на модель Profile изнутри.

test_models.py

import pytest
from mixer.backend.django import mixer

pytestmark = pytest.mark.django_db


class TestUsers:

    def test_user(self):
        obj = mixer.blend('player.User')

        assert obj.pk == 1, 'Should save one instance of a user'
        assert obj.Profile.bio is not None, 'There should be at least default bio'

Что дает мне объект `AttributeError: 'User' не имеет атрибута 'Profile'

models.py

class User(AbstractUser):
    pass


class Profile(models.Model):
    user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
    bio = models.CharField(max_length=130, default='No bio written yet.')

@receiver(post_save, sender=get_user_model())
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=get_user_model())
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

Как мне ссылаться профиль, который должен был быть создан с помощью сигналов в models.py для тестирования?

1 Ответ

0 голосов
/ 05 февраля 2020

Я нашел способ сделать это. Мой новый файл test_models.py выглядит так:

import pytest
from mixer.backend.django import mixer
from player.models import Profile

pytestmark = pytest.mark.django_db


class TestUsers:

    def test_user(self):
        obj = mixer.blend('player.User')
        prof = Profile.objects.get(user_id=1)
        prof.bio = 'Testbio'
        prof.save()
        prof = Profile.objects.get(user_id=1)
        assert obj.pk == 1, 'Should save one instance of a user'
        assert prof.bio == 'Testbio'

Я создаю пользователя, беру его профиль из базы данных, меняю биографию и сохраняю его обратно в базу данных. Я беру измененную версию из базы данных и проверяю, есть ли измененная биография там.

Если есть более элегантный способ сделать это, я был бы рад прочитать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...