单元测试以检查未生成的迁移

时间:2015-07-29 15:55:15

标签: python django unit-testing django-migrations

是否有人编写过单元测试来验证他们的Django应用程序中是否存在未经生成的迁移?我认为应该看起来像:

  1. 致电python manage.py makemigrations
  2. 将结果划分为可解析的对象
  3. 验证"no migrations were found"
  4. 如果发现迁移,则列出它们,测试失败,并删除生成的文件
  5. 如果没有,我将写一个,以便我们的构建失败。

4 个答案:

答案 0 :(得分:2)

我会使用--dry-run flag并测试它是空的。

答案 1 :(得分:1)

这应该可以解决问题 - 没有刮擦。

它将显示迁移的名称,但如果有疑问,您仍需要在调试器中查看changes

class MigrationsCheck(TestCase):
    def setUp(self):
        from django.utils import translation
        self.saved_locale = translation.get_language()
        translation.deactivate_all()

    def tearDown(self):
        if self.saved_locale is not None:
            from django.utils import translation
            translation.activate(self.saved_locale)

    def test_missing_migrations(self):
        from django.db import connection
        from django.apps.registry import apps
        from django.db.migrations.executor import MigrationExecutor
        executor = MigrationExecutor(connection)
        from django.db.migrations.autodetector import MigrationAutodetector
        from django.db.migrations.state import ProjectState
        autodetector = MigrationAutodetector(
            executor.loader.project_state(),
            ProjectState.from_apps(apps),
        )
        changes = autodetector.changes(graph=executor.loader.graph)
        self.assertEqual({}, changes)

答案 2 :(得分:1)

自Django 1.10起,makemigrations管理命令包含--check选项。如果缺少迁移,该命令将以非零状态退出。

用法示例:

./manage.py makemigrations --check --dry-run

文档:

https://docs.djangoproject.com/en/2.0/ref/django-admin/#cmdoption-makemigrations-check

答案 3 :(得分:0)

你可以从https://github.com/django/django/blob/master/django/core/management/commands/makemigrations.py#L68窃取一些代码。迁移到较新的django版本可能需要额外的5分钟