如何在Django单元测试中表示外键查找表?

时间:2018-02-12 17:58:07

标签: django unit-testing django-models

我正在构建三个Django模型,允许用户创建表示他们想要参加的活动(例如电影,音乐会和体育赛事)的项目列表。由于每个用户可以在列表中包含一个或多个项目(即活动),并且多个用户可能在其中一个列表中具有相同的项目(活动),因此列表和项目之间存在多对多关系:

'list_type'表是外键查找表,用于标识列表中存储的活动项目(电影等)的类型。当我运行创建表的初始迁移时,我通过Django迁移预填充此表。

# list/models.py
class ListType(models.Model):
    LIST_TYPES = (
        (1, 'Movie'),
        (2, 'Concert'),
        (3, 'Sport'),
    )
    type = models.CharField(_('type'), max_length=16)
    class Meta:
        db_table = 'list_type'

class List(models.Model):
    user = models.ForeignKey(User)
    type = models.ForeignKey(ListType, help_text=_('Type of list'))
    name = models.CharField(_('list'), max_length=128, help_text=_('Name of list'))
    class Meta:
        db_table = 'list'
        unique_together = (('user', 'type', 'name'), )

class Item(models.Model):
      # value contains the pk of a movie, concert, or sporting event record
    lists = models.ManyToManyField(List, related_name='items').
    value = models.IntegerField(_('item'), help_text=_('Item in list'))
    class Meta:
        db_table = 'item'

我一直在尝试用工厂男孩工厂代表Type表:

import factory
from list.models import ListType

class ListTypeFactory(factory.django.DjangoModelFactory):
    type = 'Movie'
    #type = ListType.objects.get(type='Movie')

    class Meta:
        model = Type

我遇到的问题是,当我运行单元测试并且只是设置时,我收到错误:

class ListTest(TestCase):
    def setUp(self):
        self.activity_type = ListTypeFactory(type='Member')

# => IntegrityError: duplicate key value violates unique constraint...
# => "Key (type)=(Movie) already exists"
...

这是有道理的,因为Django TestCase测试工具会复制我的所有表,并且list_type表已预先填充。但是在单元测试中表示此表的正确方法是什么? Factory-boy似乎不是正确的机制,我不想触摸数据库来创建表的实例,因为触摸数据库是一个单元测试反模式。

0 个答案:

没有答案