测试中的模型 - Django 1.7问题

tun*_*rob 14 python django django-testing django-1.7 django-migrations

我正在尝试移植我的项目以使用Django 1.7.一切都很好,除了一件事.测试文件夹内的模型.

Django 1.7新迁移在内部运行migrate命令.在syncdb运行之前.这意味着如果模型未包含在迁移中 - 它将不会填充到DB(以及测试数据库).这正是我现在所经历的.

我所做的是:

在我的/app/tests/models.py虚拟模型中:class TestBaseImage(BaseImage): pass 它所做的只是从抽象 BaseImage模型继承.

然后在测试中我创建该虚拟模型的实例来测试它.

问题是它不再起作用了.它不包含在迁移中(这很明显,因为我不想将我的测试模型保存在生产数据库中).运行我的测试会导致DB错误table does not exist.这是有道理的,因为它不包含在迁移中.

有没有办法让它适用于新的迁移系统?我找不到一种"修复"的方法.

我使用的代码:

应用程序/测试/ models.py

from ..models import BaseImage


class TestBaseImage(BaseImage):
    """Dummy model just to test BaseImage abstract class"""
    pass
Run Code Online (Sandbox Code Playgroud)

应用程序/ models.py

class BaseImage(models.Model):
    # ... fields ...
    class Meta:
        abstract = True
Run Code Online (Sandbox Code Playgroud)

工厂:

class BaseImageFactory(factory.django.DjangoModelFactory):
    """Factory class for Vessel model"""
    FACTORY_FOR = BaseImage
    ABSTRACT_FACTORY = True


class PortImageFactory(BaseImageFactory):
    FACTORY_FOR = PortImage
Run Code Online (Sandbox Code Playgroud)

示例测试:

def get_model_field(model, field_name):
    """Returns field instance"""
    return model._meta.get_field_by_name(field_name)[0]


def test_owner_field(self):
    """Tests owner field"""
    field = get_model_field(BaseImage, "owner")

    self.assertIsInstance(field, models.ForeignKey)
    self.assertEqual(field.rel.to, get_user_model())
Run Code Online (Sandbox Code Playgroud)

nit*_*ely 5

有一张票要求在这里进行仅测试模型的方法

作为一种解决方法,您可以将tests.py解耦并使其成为应用程序.

tests
|--migrations
|--__init__.py
|--models.py
|--tests.py
Run Code Online (Sandbox Code Playgroud)

你最终会得到这样的东西:

myapp
|-migrations
|-tests
|--migrations
|--__init__.py
|--models.py
|--tests.py
|-__init__.py
|-models.py
|-views.py
Run Code Online (Sandbox Code Playgroud)

然后你应该把它添加到你的 INSTALLED_APPS

INSTALLED_APPS = (
    # ...
    'myapp',
    'myapp.tests',
)
Run Code Online (Sandbox Code Playgroud)

您可能不希望myapp.tests在生产中安装,因此您可以保留单独的设置文件.像这样的东西:

INSTALLED_APPS = (
    # ...
    'myapp',
)

try:
    from local_settings import *
except ImportError:
    pass
Run Code Online (Sandbox Code Playgroud)

或者更好的是,创建一个测试运行器并在那里安装测试.

最后但并非最不重要的,记得跑 python manage.py makemigrations

  • 不,答案表明使用单独的设置文件进行测试与prod,以避免在生产中创建测试模型. (3认同)