数据迁移仅在第一次测试时执行

时间:2015-08-13 14:47:51

标签: django django-testing django-migrations django-1.8

我有一个简单的数据迁移,它创建了一个Group,如下所示:

def make_manager_group(apps, schema_editor):
    Group = apps.get_model("auth", "Group")
    managers_group = Group(name="managers")
    managers_group.save()

class Migration(migrations.Migration):

    dependencies = [
        ('my_app', '0001_initial'),
        ('auth', '0006_require_contenttypes_0002'),
    ]

    operations = [
        migrations.RunPython(make_manager_group, reverse_code=lambda *args, **kwargs: True)
    ]

和一个包含以下测试的简单功能测试应用程序:

from django.contrib.auth.models import Group
from django.contrib.staticfiles.testing import StaticLiveServerTestCase

class FunctionalTest(StaticLiveServerTestCase):

    def setUp(self):
        print("Groups : {}".format(Group.objects.all()))

    def test_2(self):
        pass

    def test_1(self):
        pass

当我运行测试时,我得到:

Creating test database for alias 'default'...
Groups : [<Group: managers>]
.Groups : []
.

显然,在创建测试数据库时正在创建组,但是在测试之间重置此数据库时,它将重置为空数据库,而不是应用所有迁移后的状态。

模型本身不包含任何特殊内容(我只为迁移创建了一个不是第一个,就像在我正在处理的项目中一样,但我不确定它是否完全需要)。< / p>

这是一个错误,还是我遗漏了一些关于数据迁移的错误,以便能够在每次测试开始时创建我的组?

编辑1:我正在使用Django 1.8.3

编辑2: Quick'n'dirty hack添加到测试类的setUp中:

    from django.contrib.auth.models import Group, Permission
    if not Group.objects.all():
        managers_group = Group(name="managers")
        managers_group.save()
        managers_group.permissions.add(
            Permission.objects.get(codename='add_news'),
            Permission.objects.get(codename='change_news'),
            Permission.objects.get(codename='delete_news')
        )

这几乎是干的,但直到现在,我找不到另一种方式......

1 个答案:

答案 0 :(得分:6)

我回答我自己的问题:

似乎是filed bug已成为documented

它表示使用TransactionTestCase及其子类(在我的情况下为LiveServerTestCase)并不会在每次测试之前插入数据迁移。它只为第一个做了一次。

它还说我们可以将serialized_rollback设置为True,这应该强制回滚到已填充的数据库。但在我的情况下,我的错误与错误报告中的最后一条消息相同。

所以我现在要坚持使用我的脏黑客,并且可能会创建一个数据夹具,因为它说每次都使用灯具。