没有创建Django测试表

时间:2015-06-22 06:40:46

标签: python django django-testing python-unittest pytest-django

我试图为我的django项目编写测试用例,但是当我跑步时 " $ ./manage.py test"命令 它创建测试数据库,但它没有创建任何表,我收到表不存在的错误。欢迎任何建议。这是我通过" ./ manage.py inspectdb>创建的模型。 models.py"

class MyCustomModel(models.Model):
    name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)

    class Meta:
       managed = False
       db_table = 'MY_TABLE'

4 个答案:

答案 0 :(得分:5)

您的表格不受管理(managed = False),因此在迁移或测试期间不会自动创建。

  1. 如果您的表格应该在迁移期间创建,请删除managed = False
  2. 如果您的表是在迁移期间不应创建的视图或遗留表,则需要在测试期间管理模型。
  3. 如果是2,并且您使用的是简单的manage.py test,我找到的最佳解决方案是添加一个测试运行器,修改任何非托管模型上的托管标志。我在runners.py文件中看起来像这样:

    # Credit:
    # http://birdhouse.org/blog/2015/03/25/django-unit-tests-against-unmanaged-databases/
    # https://www.caktusgroup.com/blog/2010/09/24/simplifying-the-testing-of-unmanaged-database-models-in-django/
    
    from smapi.settings import *
    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 __init__(self, **kwargs):
            from django.apps import apps
    
            super(ManagedModelTestRunner, self).__init__(**kwargs)
    
            # for a in apps.get_apps():
            #     print("Found app %s" % (a))
    
            # NOTE: apps must be registered in INSTALLED_APPS in settings.py before their models appear here
            all_models = apps.get_models()
            # for m in all_models:
            #     print("Found model %s - Managed:%s" % (m, m._meta.managed))
    
            self.unmanaged_models = [m for m in all_models if not m._meta.managed]
    
        def setup_test_environment(self, *args, **kwargs):
            for m in self.unmanaged_models:
                m._meta.managed = True
                # print("Modifying model %s to be managed for testing - Managed:%s" % (m, m._meta.managed))
            super(ManagedModelTestRunner, self).setup_test_environment(*args, **kwargs)
    
        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
                # print("Resetting model %s to be unmanaged - Managed:%s" % (m, m._meta.managed))
    

    通过将此行添加到settings.py:

    来激活它
    # Set Django's test runner to the custom class defined in runners.py
    TEST_RUNNER = '<project name>.runners.ManagedModelTestRunner'
    

    最后,我今天在这里,因为我们开始使用pytest进行测试,上面的解决方案停止了工作。经过一系列的搜索,我在上面的示例中记录的一个页面的评论中发现了一个修复程序(source, credit to Jan Murre

      

    谢谢你的伎俩。因为我使用pytest-django我必须找到   我的方式如何做到这一点。

         

    pytest-django使用灯具。已有一个夹具可以做到   setup_test_environment()调用。

         

    所以,我们需要一个前面的夹具来设置   '_meta.managed'。似乎自动装置在执行中   字母顺序,所以要在pytest-django夹具之前(那个   有一个以'_django'开头的名字,我们的夹具的名称开始   用'__'。

    @pytest.fixture(autouse=True, scope='session')
    def __make_unmanaged_managed():
        from django.db.models.loading import get_models
        unmanaged_models = [m for m in get_models() if not m._meta.managed]
        for m in unmanaged_models:
            m._meta.managed = True
    

    我们将上面的代码放在conftest.py中,我们的测试又开始了。

答案 1 :(得分:3)

pytest在测试期间为非托管模型创建表

--nomigrations添加到您的pytest.ini

[pytest] addopts = --nomigrations

并将其添加到您的顶级conftest.py

@pytest.fixture(autouser=True, scope="session")
def django_test_environment(django_test_environment):
    from django.apps import apps

    get_models = apps.get_models

    for m in [m for m in get_models() if not m._meta.managed]:
        m._meta.managed = True

它会做魔术

答案 2 :(得分:0)

你有迁移吗?运行python manage.py makemigrations,在测试运行期间构建的数据库使用它们。

答案 3 :(得分:0)

您需要使用:

./manage.py syncdb

这取代

./django-admin migrate

来自django 1.7