如何在使用managed = False的Django测试期间创建表?

时间:2015-03-02 00:02:25

标签: python django django-testing django-1.7 django-migrations

来自oficial documentation

  

对于涉及managed=False模型的测试,您可以确保在测试设置中创建正确的表格。

我不知道如何在测试设置中创建表格。我发现这个question并且接受的答案对我没有用。我认为这是因为迁移文件。配置在迁移文件中,以便随时更改值"没有任何影响。

在Django 1.7 +中解决这个问题的方法是什么?

2 个答案:

答案 0 :(得分:0)

我认为它应该在Django 1.7+中类似。当您要运行测试时,您应该使用Django管理这些模型(仅用于测试目的)。 此转换应在创建表之前完成,Django允许您在settings.py

中为类实例设置TEST_RUNNER。
# settings_test.py
TEST_RUNNER = 'utils.test_runner.ManagedModelTestRunner'

# test_runner.py
from django.test.runner import DiscoverRunner

class ManagedModelTestRunner(DiscoverRunner):
    """
    Test runner that automatically makes all unmanaged models in your Django
    project managed for the duration of the test run, so that one doesn't need
    to execute the SQL manually to create them.
    """  
    def setup_test_environment(self, *args, **kwargs):
        from django.db.models.loading import get_models
        super(ManagedModelTestRunner, self).setup_test_environment(*args,
                                                                   **kwargs)
        self.unmanaged_models = [m for m in get_models(only_installed=False)
                                 if not m._meta.managed]
        for m in self.unmanaged_models:
            m._meta.managed = True

    def teardown_test_environment(self, *args, **kwargs):
        super(ManagedModelTestRunner, self).teardown_test_environment(*args, **kwargs)
        # reset unmanaged models
        for m in self.unmanaged_models:
            m._meta.managed = False

答案 1 :(得分:0)

我发现了一种方法。修改fixture并添加SQL以生成表:

#0001_initial.py (or followings)
class Migration(migrations.Migration):

    operations = [
        migrations.RunSQL("CREATE TABLE..."),
        ...
    ]

我是“迁移新手”,所以我不知道这是不是最好的选择。但它确实有效。