有效地測試 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
,我們可以在模型之間建立必要的關係,以確保正確的測試。
最後,如有疑問,請寫一個測試。通過注意細節捕獲瑣碎的行為變化,長時間遺忘的程式碼片段不會導致不必要的麻煩。