ITADN

Cannot have multiple test functions in the same class inheriting from MigratorTestCase

#467Openjrobichaud 创建于 2024-07-17
J
jrobichaudcommented
The way `MigratorTestCase` is implemented it is only possible to setup test data in the `prepare` function which is called during `setUp`. Because of that there is no way to setup different data for different test functions. In order to be able to support multiple test functions `MigratorTestCase` could be implemented this way: ```python @tag(MIGRATION_TEST_MARKER) class MigratorTestCase(TransactionTestCase): """Used when using raw ``unitest`` library for test.""" database_name: ClassVar[Optional[str]] = None old_state: ProjectState new_state: ProjectState #: Part of the end-user API. Used to tell what migrations we are using. migrate_from: ClassVar[MigrationSpec] migrate_to: ClassVar[MigrationSpec] auto_migrate: bool = True # <-------------- Add an option to disable automatic migration def setUp(self) -> None: """ Regular ``unittest`` styled setup case. What it does? - It starts with defining the initial migration state - Then it allows to run custom method to prepare some data before the migration will happen - Then it applies the migration and saves all states """ super().setUp() self._migrator = Migrator(self.database_name) self.old_state = self._migrator.apply_initial_migration( self.migrate_from, ) self.prepare() if self.auto_migrate: # <-------------- check if auto_migrate is activated self.migrate() # <-------------- call the extracted the method # v-------------- do the migration def migrate(self) -> None: assert not hasattr(self, "new_state"), "migrate must be called only once" self.new_state = self._migrator.apply_tested_migration(self.migrate_to) ``` it would allow to add multiple test scenarios like this: ```python class Test1234(MigratorTestCase): migrate_from = ... migrate_to = ... auto_migrate = False def prepare(self): ... # prepare common stuff here def test_scenario_1(self): ... # instantiate stuff here using old state self.migrate() ... # validate migration here using new state def test_scenario_2(self): ... # instantiate stuff here using old state self.migrate() ... # validate migration here using new state ```
3 条评论