在我的Django项目中,我有一款名为“核心”的应用程序。其中包含我所有可重用的模型mixins / abstract models(behavior.py),models(models.py),views(views.py)和helpers函数(utils.py):
core/
__init__.py
behaviors.py
models.py
utils.py
views.py
我知道要为这些文件编写测试。对于模型,工具和视图,我只是编写了像以前那样的单元测试。
我现在不确定如何测试behavior.py中包含的抽象模型。例如,我有这个模型mixin:
import uuid as uuid_lib
from django.db import models
class UniversallyUniqueIdentifiable(models.Model):
uuid = models.UUIDField(
db_index=True,
default=uuid_lib.uuid4,
editable=False
)
class Meta:
abstract = True
如何测试抽象模型? 在one of the articles我曾经学过脂肪模型,作者只是测试他使用抽象模型的模型。但这对我来说感觉不是很干,因为这意味着我必须测试在我使用它的每个模型中添加UUID。 有没有更好的方法呢?
答案 0 :(得分:2)
尝试以下代码
from django.db import connection
from django.db.models.base import ModelBase
from django.test import TestCase
from .models import UniversallyUniqueIdentifiable
import uuid
class TestUniversallyUniqueIdentifiable(TestCase):
model = UniversallyUniqueIdentifiable
def setUp(self):
# Create a dummy model
self.model = ModelBase(
'__TestModel__' + self.model.__name__, (self.model,),
{'__module__': self.model.__module__}
)
# Create the schema for our test model
with connection.schema_editor() as schema_editor:
schema_editor.create_model(self.model)
def test_mytest_case(self):
self.model.objects.create(uuid=uuid.uuid4())
self.assertEqual(self.model.objects.count(), 1)
def tearDown(self):
# Delete the schema for the test model
with connection.schema_editor() as schema_editor:
schema_editor.delete_model(self.model)
答案 1 :(得分:2)
Anjaneyulu Batta的答案令人惊讶,但可读性不强,如果Django团队更改connection
内部行为方式,则可能难以维护。
我会做什么:
示例:一个抽象类 Parallelogram
和一个使用它的模型称为 Square
。
from unittest import TestCase
from tetrahedrons.models import Parallelogram, Square
class ParallelogramAbstractModelTest(TestCase):
def test_has_four_sides(self):
...
def test_parallel_opposite_sides(self):
...
class SquareModelTest(TestCase):
def test_subclasses_mobel_base(self):
self.assertTrue(issubclass(Parallelogram, Square))
def test_equal_sides(self):
...