Django单元测试:如何测试抽象模型?

时间:2018-05-09 07:58:44

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

在我的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。 有没有更好的方法呢?

2 个答案:

答案 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内部行为方式,则可能难以维护。

我会做什么:

  1. 使用此抽象类通过 任何模型测试抽象类的通用属性。
  2. 测试该子类化抽象类。
  3. 测试此模型的特定属性
  4. 对其他任何型号重复2和3。

示例:一个抽象类 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):
        ...