2015-06-22 60 views
0

我想编写测试用例为我的Django项目,但是当我运行 “$ ./manage.py测试”命令 其创建测试数据库,但其没有创建任何表和我会发生表格不存在的错误。欢迎任何建议。这是我通过“./manage.py inspectdb> models.py创建的模型”Django的测试表

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' 

回答

0

您是否有迁移?运行python manage.py makemigrations,在测试运行期间建立的数据库使用它们。

+0

谢谢,但它不适用于我 –

0

您需要使用:

./manage.py syncdb 

这是由

./django-admin migrate 

取代从Django的1.7

+0

我已经试过上面的命令,但没有任何工作对我来说 –

2

你的表是不受管理(managed = False),所以它不会迁移过程中自动创建或测试。

  1. 如果您的表应该得到迁移过程中创建的,只是删除managed = False线
  2. 如果你的表是不是应该得到迁移过程中创建的视图或传统的表,你需要做的模型在测试期间管理。

如果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和我们的测试又开始工作。

+0

这是Django 1.9及以后的类似代码,认为它不适合我:'''from django.apps .apps import get_models''' – elke