He intentado escribir una prueba en archivos de migración específicos . Básicamente, quería probar el estado actual de la base de datos y los datos entre un par de migraciones. Usé MigrationExecutor
de la siguiente manera:
executor = MigrationExecutor(connection) old_apps = executor.loader.project_state(self.migrate_from).apps executor.migrate(self.migrate_from) # do something here executor.migrate(self.migrate_to)
Tenemos tantos archivos de migración en el proyecto, por lo que ejecutarlos todos con pruebas unitarias lleva mucho tiempo. Por lo general, configuraría los módulos de migración en None
en settings_test.py
:
MIGRATION_MODULES: { 'my_app': None }
Con esta configuración, la prueba se ejecutaría muy rápido. El problema es que los archivos de migración para probar ( self.migrate_from
y self.migrate_to
) ya no se pueden encontrar:
django.db.migrations.exceptions.NodeNotFoundError: Node ('poleluxe', '0090_auto_previous_migration') not a valid node
Así que tuve que incluir los módulos de migración nuevamente en la prueba.
¿Hay alguna forma de incluir archivos de migración sin ejecutarlos todos? En mi caso, quiero omitir todas las migraciones de 0001
a 0089
y ejecutar solo 0090
(como self.migration_from
) y 0091
(como self.migrate_to
).
Estoy pensando en aplastar las primeras 89 migraciones y poner el resultado en una carpeta separada junto con 0090
y 0091
, luego referirme a esa carpeta de migración en la prueba. Sin embargo, no estoy seguro de si esto sería una gran solución.
Esto es lo que entiendo hasta ahora, por favor guíame si no estoy en lo correcto.
El problema
@override_setting
y setUpClass()
La solución
Anule la configuración de MIGRATION_MODULES
al comienzo de TestClass, incluso cuando TestClass no se inicializó por completo porque ahí es donde solo encontré el punto correcto.
De esta manera, no solo puede deshabilitar toda la migración para acelerar cuando ejecuta sus pruebas, sino que también puede probar los archivos de migración.
Deshabilite toda la migración desde settings.py
.
MIGRATION_MODULES = {app: None for app in INSTALLED_APPS}
--nomigrations
de la configuración de pytest si usa pytest-django.Anule la configuración de 'MIGRATION_MODULES' y vuelva a configurarla después de la prueba.
class TestMigrations(TestCase): origin_modules = getattr(settings, 'MIGRATION_MODULES', {}) setattr(settings, 'MIGRATION_MODULES', {}) ... @classmethod def tearDownClass(cls): setattr(settings, 'MIGRATION_MODULES', cls.origin_modules) super().tearDownClass()
Información de prueba
@override_setting
en TestClass o TestMethod No funciona porque Django inicia y ejecuta la migración antes que la decoración de @override_setting
--nomigrations
No funciona , no estoy tan seguro, pero mi solución es deshabilitar las migraciones desde la configuración de Django en lugar de pytest-django