8

我的 django 应用程序适用于不受管理的表,并且在我的模型中定义了以下内容,如下所示:

class Meta:
    managed  = False
    db_table = 'mytable'

当我运行一个导入人员的简单测试时,我得到以下信息:

(person)bob@sh ~/person/dapi $  > python manage.py test
Creating test database for alias 'default'...
DatabaseError: (1060, "Duplicate column name 'db_Om_no'")

tests.py 非常简单,如下所示:

import person.management.commands.dorecall
from person.models import Person
from django.test import TestCase
import pdb

class EmailSendTests(TestCase):
    def test_send_email(self):
        person = Person.objects.all()[0]
        Command.send_email()

我确实在django 文档中读过,其中说“对于涉及 managed=False 的模型的测试,由您来确保创建正确的表作为测试设置的一部分。”。所以我明白我的问题是我没有创建适当的表。那么我应该test_person在测试框架创建的数据库中创建表的副本吗?

每次我运行测试时,test_person数据库都会被破坏(我认为)并重新设置,所以我应该如何在test_person. 我在想这个吗?

更新:

在 SO 上看到了这个问题并添加了ManagedModelTestRunner()in utils.py。虽然ManagedModelTestRunner()确实运行(通过插入确认pbd.set_trace()),但我仍然收到Duplicate column name错误。当我这样做时,我没有收到错误python manage.py syncdb(尽管这可能没有太大意义,因为表已经创建 - 将尝试删除表并重新运行 syncdb 以查看是否可以获得任何线索)。

4

1 回答 1

2

我有同样的问题,我有一个非托管的遗留数据库,它还在模型元属性中设置了一个自定义数据库名称。

正如您所链接的那样,使用托管模型测试运行器运行测试解决了我的一半问题,但我仍然遇到 Django 不知道 custom_db 名称的问题:

django.db.utils.ProgrammingError: relation "custom_db" does not exist

问题是./manage.py makemigrations仍然会创建所有模型的定义,无论是否托管,并在定义中包含您的自定义数据库名称,这似乎会破坏测试。通过安装:

pip install django-test-without-migrations==0.2

并像这样运行测试:

./manage.py test --nomigrations

我能够针对我的非托管模型编写测试而不会出现任何错误。

于 2015-07-29T17:46:20.423 回答