我有一个Django应用,该应用需要settings以下形式的属性:
settings
RELATED_MODELS = ('appname1.modelname1.attribute1', 'appname1.modelname2.attribute2', 'appname2.modelname3.attribute3', ...)
然后钩住它们的post_save信号,以根据attributeN定义更新其他固定模型。
我想测试这种行为,即使该应用程序是项目中的唯一应用程序,测试也应该可以进行(除了它自己的依赖项之外,不需要安装其他包装器应用程序)。如何仅为测试数据库创建和附加/注册/激活模拟模型?(或者有可能吗?)
允许我使用测试治具的解决方案会很棒。
你可以将测试放在tests/应用程序的子目录(而不是tests.py文件)中,并tests/models.py在仅测试模型中包含。
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+中则不再适用。用它。)
TransactionTestCase
在测试开始时(即在setUp方法中,或在一组doctests的开始处),可以动态地添加"myapp.tests"到INSTALLED_APPS设置中,然后执行以下操作:
"myapp.tests"
from django.core.management import call_command from django.db.models import loading loading.cache.loaded = False call_command('syncdb', verbosity=0)
然后,在测试结束时,应通过还原旧版本的INSTALLED_APPS并再次清除应用程序缓存来进行清理。