Модульное тестирование команды управления, использующей модель, полученную из класса абстрактной модели, где модель создается только для целей тестирования - PullRequest
2 голосов
/ 14 октября 2019

Я создал класс абстрактной модели, который можно использовать для создания конкретных моделей. Поскольку я собираюсь поместить это в отдельный модуль django для повторного использования, у меня нет конкретной модели в моем пакете. Я тестирую свой абстрактный класс AbstractBaseModel, динамически создавая конкретную модель в своих тестах:

class AbstractModelTestCase(TestCase):

    @classmethod
    def setUpClass(cls):

        class LocationTestModel(AbstractBaseModel):
            name = models.CharField(max_length=100)
            title = models.CharField(max_length=100, blank=True)
            num = models.IntegerField(default=0)

        try:
            with connection.schema_editor() as editor:
                editor.create_model(LocationTestModel)
            super(AbstractModelTestCase, cls).setUpClass()
        except ProgrammingError:
            pass

        cls.Location = LocationTestModel

    @classmethod
    def tearDownClass(cls):
        try:
            with connection.schema_editor() as editor:
                editor.delete_model(cls.Location)
            super(AbstractModelTestCase, cls).tearDownClass()
        except ProgrammingError:
            pass

Это прекрасно работает: в моих тестовых примерах self.Location - это моя тестовая модель, и я могу создавать иманипулируйте им, как любой другой конкретной моделью.

Теперь я хотел бы протестировать команду управления, используя call_command. Моя команда управления принимает app_label в качестве аргумента, а затем ищет все модели в приложении app_label, проверяя, какие модели являются подэлементами моего AbstractBaseModel, например:

    def get_models_to_handle(self, app_label):
        try:
            app_to_handle = apps.get_app_config(app_label)
        except LookupError:
            app_to_handle = None

        models = []
        if app_to_handle:
            app_models = app_to_handle.get_models()
            models.extend(model for model in app_models if issubclass(model, AbstractBaseModel))

        return models

цель состоит в том, чтобы сделать что-то для каждой из этих моделей.

Однако это не сработает для моего тестового примера, поскольку модель AbstractModelTestCase.Location не зарегистрирована как часть приложения, поэтому * 1018 нет* Я могу пройти.

Как я могу проверить мою команду управления с моей динамически созданной тестовой моделью? Есть ли способ зарегистрировать его как часть тестового приложения? Или есть другой способ определения тестового приложения и тестовой модели, которые существуют только для целей тестирования, не прибегая к использованию setUpClass?

Я видел этот пост, но яне понимаю, что нужно для динамического добавления тестового приложения в INSTALLED_APPS в последних версиях Django (1.11+) (ссылка на пример, на которую ссылаются, не работает).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...