2017-02-23 65 views
0

我在使用Django 1.10.5与django-cookiecutter项目设置。我有一个非管理模式,看起来像这样的:Django测试架构模式未找到

# -*- coding: utf-8 -*- 
from django.db import models 
from django.conf import settings 


class MyModel(models.Model): 
    """Base account model.""" 
    account_nm = models.CharField(max_length=255, blank=True, null=True, 
            db_column='customer_nm') 

    class Meta: 
     app_label = 'mylabel' 
     db_table = '"stage"."mytable"' 
     managed = False if not settings.TESTING else True 

的管理设置是为了建立我的桌子时,我测试,但在任何其他情况。我正在用django-pytest运行我的测试,就像py.test --reuse-db一样。我的后端是Redshift,这个非管理型号使用django-redshift-backend

如果我只用db_table = 'mytable'运行测试,我的测试数据库中public模式下的表已成功创建。如果我使用架构如上所示运行db_table的测试,则会收到错误消息。

E    django.db.utils.ProgrammingError: schema "myschema" does not exist 
E    LINE 1: CREATE TABLE "myschema"."mytable" (.... 

我可以在正常情况下用特定的模式应用成功地使用这种模式。为什么我在测试时无法在架构中创建表格?

回答

0

我认为这是因为您没有在test_**数据库中创建stage架构,而stage架构存在于您的“开发/生产”环境中。

我有以下步骤运行,终于成功运行单元测试 (假设数据库名称是app):

  1. 转储和复制数据库apptest_app
  2. 确保stage架构在test_app下创建,mytable在架构stage下创建。 (我有节制地打开managed选项并运行python migrate,这样我就可以让Django的,为我创造MYTABLE)
  3. 运行Django的单元测试命令:

    python manage.py test --keepdb # --keepdb is available from django 1.8 and later. 
    

test.py

from django.test import TestCase 
from app.models import MyModel 


class TestMyModel(TestCase): 

    def testRetrieve(self): 
     self.assertRaises(MyModel.objects.get(pk=1)) 

我还没有尝试pytest,但我认为它大都是相同的。

+0

感谢您的回复。它确实看起来像我在我的测试数据库中创建了阶段模式。我在我的DATABASES设置中指定为我的测试使用名为test的数据库。 – duffn

+0

@duffn测试数据库可能在测试后被丢弃吗? – Enix

+0

我不这么认为。 - - 重用数据库可以防止这种情况。 – duffn