Я создал класс абстрактной модели, который можно использовать для создания конкретных моделей. Поскольку я собираюсь поместить это в отдельный модуль 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+) (ссылка на пример, на которую ссылаются, не работает).