为具有多对多关系的Django模型编写测试

时间:2018-02-09 12:59:05

标签: python django testing django-models

我想为具有多对多关系的Django模型编写测试,但是我收到了这个错误:

  

ValueError:“< Tour:tour>”需要在之前有字段“id”的值   可以使用这种多对多的关系。

我的测试:

class ModelTestCase(TestCase):
    def setUp(self):
        self.mock_file = mock.MagicMock(File)
        self.mock_file.name = 'MockFile'
        self.before_count = Tour.objects.count()
        self.tour_agency = TourAgency.objects.create(
            name='agency',
            username='agency')
        self.tour_category = TourCategory.objects.create(name='category')
        self.tour_equipment = TourEquipment.objects.create(name='equipment')
        self.tour_leader = TourLeader.objects.create(
            name='leader',
            email='leader@sample.com',
            username='leader',
            bio='sample text',)
        self.tour_tag = TourTag.objects.create(name='tag')

    def test_model_can_create_tour(self):
        self.tour = Tour.objects.create(
            name='tour',
            description='description',
            summary='summary',
            agency=self.tour_agency,
            equipment=self.tour_equipment,
            category=self.tour_category,
            tags=self.tour_tag,
            activity_type='activity type',
            date=datetime.now,
            photo=self.mock_file)
        self.tour.save()
        self.tour.save_m2m()
        count = Tour.objects.count()
        self.assertNotEqual(self.before_count, count)

我会尝试使用.save()保存对象但不起作用。

2 个答案:

答案 0 :(得分:1)

首先需要在添加多对多关系之前保存游览模型。查看代码,我认为多对多是字段'标记'

def test_model_can_create_tour(self):
    self.tour = Tour.objects.create(
        name='tour',
        description='description',
        summary='summary',
        agency=self.tour_agency,
        equipment=self.tour_equipment,
        category=self.tour_category,
        activity_type='activity type',
        date=datetime.now,
        photo=self.mock_file)

    # Adding the tour later.
    self.tour.tags.add(self.tour_tag)
    count = Tour.objects.count()
    self.assertNotEqual(self.before_count, count)

这应该通过测试。

答案 1 :(得分:0)

要给模型添加标签(m2m字段),先保存模型,然后再给模型添加标签

self.tour.tags.add([tag names])