一尘不染

Django:如何动态创建仅用于测试的模型

django

我有一个Django应用,该应用需要settings以下形式的属性:

RELATED_MODELS = ('appname1.modelname1.attribute1',
                  'appname1.modelname2.attribute2', 
                  'appname2.modelname3.attribute3', ...)

然后钩住它们的post_save信号,以根据attributeN定义更新其他固定模型。

我想测试这种行为,即使该应用程序是项目中的唯一应用程序,测试也应该可以进行(除了它自己的依赖项之外,不需要安装其他包装器应用程序)。如何仅为测试数据库创建和附加/注册/激活模拟模型?(或者有可能吗?)

允许我使用测试治具的解决方案会很棒。


阅读 325

收藏
2020-03-31

共1个答案

一尘不染

你可以将测试放在tests/应用程序的子目录(而不是tests.py文件)中,并tests/models.py在仅测试模型中包含。

然后提供一个测试运行脚本(示例),其中包含你的tests/“ app” INSTALLED_APPS。(在实际项目中运行应用程序测试时,这是行不通的,因为真实项目中没有测试应用程序INSTALLED_APPS,但是我很少发现从项目中运行可重用的应用程序测试很有用,并且Django 1.6+默认情况下没有。 )

(注意:如果你的测试用例子类TransactionTestCase会大大降低测试速度,并且仅在Django 1.7+中不再起作用,则下面描述的替代动态方法仅在Django 1.1+中有效,而在Django 1.7+中则不再适用。用它。)

在测试开始时(即在setUp方法中,或在一组doctests的开始处),可以动态地添加"myapp.tests"到INSTALLED_APPS设置中,然后执行以下操作:

from django.core.management import call_command
from django.db.models import loading
loading.cache.loaded = False
call_command('syncdb', verbosity=0)

然后,在测试结束时,应通过还原旧版本的INSTALLED_APPS并再次清除应用程序缓存来进行清理。

2020-03-31