在django中使用非托管表运行测试

时间:2013-08-06 16:10:12

标签: django django-testing

我的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 docs中读到了“对于涉及使用managed = False的模型的测试,由您来确保在测试设置中创建正确的表格。”。所以我明白我的问题是我没有创建合适的表。所以我应该在测试框架创建的test_person db中创建表的副本吗?

每次运行测试时,test_person db都会被销毁(我认为)并重新设置,所以我应该如何在test_person中创建表的副本。我在想这个吗?

更新

我看到this question on SO并在ManagedModelTestRunner()中添加了utils.py。虽然ManagedModelTestRunner()确实已运行(通过插入pbd.set_trace()确认),但仍会出现Duplicate column name错误。我做python manage.py syncdb时没有出错(虽然这可能并不重要,因为表已经创建 - 将尝试删除表并重新运行syncdb以查看我是否可以得到任何线索。)

1 个答案:

答案 0 :(得分:2)

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

在链接到托管模型测试运行器时运行测试,解决了我的一半问题,但我仍然遇到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

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