python - 如何 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 中的信号创建的配置文件进行测试?
解决方案
我找到了一种方法。我的新 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 是否在其中。
如果有更优雅的方式来做到这一点,我很乐意阅读。
推荐阅读
- xsd - NLog:找不到架构信息
- javascript - 如何读取firestore上所有用户的所有嵌套集合?
- scala - 即使 Future 完成,Scala App 也不会退出
- apache - Apache 客户端身份验证使用来自三级证书链的相同两级的客户端和服务器证书
- sql - 计算一个单元格中的值
- jwt - 如何在不同设备上正确使用刷新令牌?
- spring-boot - 即使在更新 databasechangeloglock 后,Google Kubernetes Engine (GKE) pod 也无法释放 liquibase 锁
- javafx - 将标签 textProperty 绑定到另一个最终 ObjectProperty 持有的对象属性
- php - So how can we protect our PHP application scripts when installing locally for a client?
- log4cplus - I used log4cplus in two DLLs (a.dll and b.dll) of an exe file