用于单元测试的 Django 工厂:"Cannot assign "'1'": "User.group" 必须是 "Brand" 实例。"
Django factories for unit test: "Cannot assign "'1'": "User.group" must be a "Brand" instance."
当我 运行 我的 user_profile/model.py 单元测试时出现错误:"Cannot assign "'1'": "User.group" 必须是一个 "Brand" 实例。"
我认为这个错误是因为,在我的单元测试工厂 (factories.py
) 中,我在创建一个UserFactory() 的实例。我觉得 group 应该映射到 Brand class/factory 但我不知道该怎么做..
这是我的 user_profile/model.py
:
class Brand(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(
'username',
max_length=50,
unique=True,
db_index=True
)
email = models.EmailField('email address', unique=True)
group = models.ForeignKey(Brand, null=True, blank=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_approved = models.BooleanField(default=True)
在我的 user_profile/test/factories.py
:
from user_profile.models import User, Brand
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = User
django_get_or_create = (
'username',
'email',
'password',
'is_approved',
'is_active',
'is_staff',
'is_admin',
'group'
)
class BrandFactory(factory.django.DjangoModelFactory):
class Meta:
model = Brand
django_get_or_create = ('name',)
BrandFactory(name='BRAND1')
BrandFactory(name='BRAND2')
BrandFactory(name='BRAND3')
BrandFactory(name='BRAND4')
UserFactory(
username='myuser1@gmail.com',
email='myuser1@gmail.com',
password=12345,
is_approved=True,
is_active=True,
is_staff=True,
is_admin=True,
group="1" <--- HOW DO I MAP THIS TO THE 'BRAND1' FACTORY/CLASS?!
)
UserFactory(
username='myuser2@gmail.com',
email='myuser2@gmail.com',
password=12345,
is_approved=True,
is_active=True,
is_staff=True,
is_admin=True,
group="2" <--- HOW DO I MAP THIS TO THE 'BRAND2' FACTORY/CLASS?!
)
您必须分配 BrandFactory 的return 值给某物。例如
b1 = BrandFactory(name='BRAND1')
b2 = BrandFactory(name='BRAND2')
然后在构造函数中使用对模型实例的引用
UserFactory(
username='myuser1@gmail.com',
email='myuser1@gmail.com',
password=12345,
is_approved=True,
is_active=True,
is_staff=True,
is_admin=True,
group=b1
)
UserFactory(
username='myuser2@gmail.com',
email='myuser12@gmail.com',
password=12345,
is_approved=True,
is_active=True,
is_staff=True,
is_admin=True,
group=b2
)
当我 运行 我的 user_profile/model.py 单元测试时出现错误:"Cannot assign "'1'": "User.group" 必须是一个 "Brand" 实例。"
我认为这个错误是因为,在我的单元测试工厂 (factories.py
) 中,我在创建一个UserFactory() 的实例。我觉得 group 应该映射到 Brand class/factory 但我不知道该怎么做..
这是我的 user_profile/model.py
:
class Brand(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(
'username',
max_length=50,
unique=True,
db_index=True
)
email = models.EmailField('email address', unique=True)
group = models.ForeignKey(Brand, null=True, blank=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_approved = models.BooleanField(default=True)
在我的 user_profile/test/factories.py
:
from user_profile.models import User, Brand
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = User
django_get_or_create = (
'username',
'email',
'password',
'is_approved',
'is_active',
'is_staff',
'is_admin',
'group'
)
class BrandFactory(factory.django.DjangoModelFactory):
class Meta:
model = Brand
django_get_or_create = ('name',)
BrandFactory(name='BRAND1')
BrandFactory(name='BRAND2')
BrandFactory(name='BRAND3')
BrandFactory(name='BRAND4')
UserFactory(
username='myuser1@gmail.com',
email='myuser1@gmail.com',
password=12345,
is_approved=True,
is_active=True,
is_staff=True,
is_admin=True,
group="1" <--- HOW DO I MAP THIS TO THE 'BRAND1' FACTORY/CLASS?!
)
UserFactory(
username='myuser2@gmail.com',
email='myuser2@gmail.com',
password=12345,
is_approved=True,
is_active=True,
is_staff=True,
is_admin=True,
group="2" <--- HOW DO I MAP THIS TO THE 'BRAND2' FACTORY/CLASS?!
)
您必须分配 BrandFactory 的return 值给某物。例如
b1 = BrandFactory(name='BRAND1')
b2 = BrandFactory(name='BRAND2')
然后在构造函数中使用对模型实例的引用
UserFactory(
username='myuser1@gmail.com',
email='myuser1@gmail.com',
password=12345,
is_approved=True,
is_active=True,
is_staff=True,
is_admin=True,
group=b1
)
UserFactory(
username='myuser2@gmail.com',
email='myuser12@gmail.com',
password=12345,
is_approved=True,
is_active=True,
is_staff=True,
is_admin=True,
group=b2
)