首页 > 解决方案 > 如何 PyTest、Mixer、Django、OneToOneField

问题描述

正如大多数 Django 教程所建议的那样,我通过创建自己的用户模型AbstractUser并创建了一个Profile-model,其中包含更多详细信息,例如User通过 OneToOneField 链接到的 bio。

现在我开始编写测试,我不确定如何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'

模型.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 中的信号创建的配置文件进行测试?

标签: pythondjangopytest

解决方案


我找到了一种方法。我的新 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'

我创建了一个用户,我从数据库中获取了他的个人资料,我更改了简历并将其保存回数据库。我从数据库中获取更改后的版本并检查更改后的 bio 是否在其中。

如果有更优雅的方式来做到这一点,我很乐意阅读。


推荐阅读