在Django模型中测试'class Meta'

时间:2017-09-01 16:10:08

标签: django unit-testing django-models django-testing

如何在Django模型中测试订购唯一 unique_together

2 个答案:

答案 0 :(得分:2)

订购 - 创建几个实例,然后检查订单是否正确。例如:

self.assertEqual(list[0], a)
self.assertEqual(list[1], b)
etc

唯一 - 创建一个实例,尝试使用相同的唯一字段创建另一个实例。断言有一个例外:

with self.assertRaises(IntegrityError):
    MyModel.objects.create(unique_field=the_same_value)

Unique Together 唯一相同。

希望它有所帮助!

答案 1 :(得分:2)

如MDN Django教程第10部分所述,“您应该测试自己代码的所有方面,但不要作为Python或Django的一部分提供的任何库或功能。”请参见{{3 }}。要测试您编写的内容,您应该访问模型类的meta属性和模型的字段。例如,按照以下方式定义图书模型:

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey('Author', on_delete=models.SETNULL, null=True)
    isbn = models.CharField('ISBN', max_length=13, unique=True)

    class Meta:
        unique_together(('title', 'author'),)
        ordering = ['author']

将对Book模型的唯一性,唯一性和顺序进行单元测试,如下所示:

class BookModelTests(TestCase):
    @classmethod
    def setUpTestdata(cls):
        #create an author instance and a book instance

    def test_isbn_is_unique(self):
        book = Book.objects.get(id=1)
        unique = book._meta.get_field('isbn').unique
        self.assertEquals(unique, True)

    def test_book_is_unique(self):
        book = Book.objects.get(id=1)
        unique_together = book._meta.unique_together
        self.assertEquals(unique_together[0], ('title', 'author'))

    def test_book_ordering(self):
        book = Book.objects.get(id=1)
        ordering = book._meta.ordering
        self.assertEquals(ordering[0], 'author')