Юнит-тестирование Django: Как тестировать абстрактные модели? - PullRequest
0 голосов
/ 09 мая 2018

В моем Django Project у меня есть приложение под названием «core», которое содержит все мои многократно используемые смешанные модели / абстрактные модели (поступки .py), модели (models.py), представления (views.py) и вспомогательные функции (utils). р):

core/
    __init__.py
    behaviors.py  
    models.py
    utils.py
    views.py

Теперь я хочу написать тесты для этих файлов. Для моделей, утилит и представлений я просто написал модульные тесты, как я привык

Теперь я не уверен, как мне следует тестировать абстрактные модели, содержащиеся в высоком поведении.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

Как проверить абстрактную модель? В одной из статей , которую я использовал, чтобы узнать о толстых моделях, автор просто тестирует модели, в которых он использовал абстрактные модели. Но это не очень СУХО для меня, так как это означало бы, что мне придется тестировать добавление UUID в каждой модели, в которой я его использую. Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Анджанеюлу Батта * Ответ 1002 * удивителен, но не так удобен для чтения и может быть менее понятным, если команда 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):
        ...
0 голосов
/ 09 мая 2018

попробуйте ниже код

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...