有效地测试 Django 模型
假设上课
from django.db import models
class Author(models.Model):
   name = models.CharField(max_length=50)
   
    def __str__(self):
        return self.name
    
    def get_absolute_url(self):
        return reverse('view_author', args=[str(self.id)])
class Book(models.Model):
    author = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
    private = models.BooleanField(default=false)
    publish_date = models.DateField()
    def get_absolute_url(self):
        return reverse('view_book', args=[str(self.id)])
    
    def __str__(self):
        return self.name
测试示例
from django.test import TestCase
from .models import Book, Author
class BaseModelTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        super(BaseModelTestCase, cls).setUpClass()
        cls.author = Author(name='hawking')
        cls.author.save()
        cls.first_book = Book(author=cls.author, name="short_history_of_time")
        cls.first_book.save()
        cls.second_book = Book(author=cls.author, name="long_history_of_time")
        cls.second_book.save()
class AuthorModelTestCase(BaseModelTestCase):
    def test_created_properly(self):
         self.assertEqual(self.author.name, 'hawking')
         self.assertEqual(True, self.first_book in self.author.book_set.all())
    
    def test_absolute_url(self):
        self.assertEqual(self.author.get_absolute_url(), reverse('view_author', args=[str(self.author.id)]))
class BookModelTestCase(BaseModelTestCase):
    
    def test_created_properly(self:
        ...
        self.assertEqual(1, len(Book.objects.filter(name__startswith='long'))
    
    def test_absolute_url(self):
        ...
一些观点
created_properly测试用于验证 django 模型的状态属性。它们有助于捕捉我们更改默认值,file_upload_paths 等的注意事项。absolute_url可能看起来微不足道,但我发现它在改变 url 路径时帮助我防止了一些错误- 我同样为模型中实现的所有方法编写测试用例(使用 
mock对象等) - 通过定义一个共同的 
BaseModelTestCase,我们可以在模型之间建立必要的关系,以确保正确的测试。 
最后,如有疑问,请写一个测试。通过注意细节捕获琐碎的行为变化,长时间遗忘的代码片段不会导致不必要的麻烦。