【问题标题】:Running tests with unmanaged tables in django在 django 中使用非托管表运行测试
【发布时间】:2013-08-07 18:12:37
【问题描述】:

我的 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 并在utils.py 中添加了ManagedModelTestRunner()。虽然ManagedModelTestRunner() 确实运行(通过插入pbd.set_trace() 确认),但我仍然收到Duplicate column name 错误。当我执行 python manage.py syncdb 时,我没有收到错误(尽管这可能并不意味着太多,因为表已经创建 - 将尝试删除表并重新运行 syncdb 以查看是否可以获得任何线索)。

【问题讨论】:

    标签: django django-testing


    【解决方案1】:

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

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

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

    【讨论】:

    • 我知道这篇文章已经过时了,但希望这对某人有所帮助。
    • 救命稻草。非常感谢。在 Django 中使用遗留数据库是 PITA。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多