我最近在django项目中实现了一个可重用的应用程序。为了方便起见,我们叫它reusable_app
。这个应用程序也有一些运行的单元测试,然而,这些测试依赖于在model.py
中测试旁边声明的一些基本模型。
/resuable_app
__init__.py
models.py
views.py
urls.py
/tests
__init__.py
tests.py
/simple_app
__init__.py
models.py
现在,模型不会加载到数据库中,除非我在测试配置文件中指定INSTALLED_APPS
中的文件夹。我想知道是否有另一种方法来实现这一点,而不必在设置文件中暴露应用程序?我似乎能够通过@override_settings
指定应用程序,但没有运行迁移。
,
@override_settings(INSTALLED_APPS=['reusable_app'])
class TestReusableApp(TestCase):
def test_something(self):
...
如果在设置模块INSTALLED_APPS
中没有指定reusable_app
,这仍然会产生ProgrammingError
。是我漏掉了什么,还是有别的方法?
我认为这里的问题是测试运行器在添加@override_settings
应用程序之前设置了表。
通常,我对可重用应用程序所做的是在一个"示例"应用程序的上下文中运行测试,设置包括你想要测试的应用程序。通常工作得很好,因为我将可重用的应用程序单独打包。以下是我过去一个项目中的一个例子。
但是,如果这是不可能的,您可以尝试在测试中覆盖setUp
,并在该代码中调用"migrate"命令。例如:
from django.core.management import call_command
@override_settings(INSTALLED_APPS=['reusable_app'])
MyTestCase(TestCase):
def setUp(self):
call_command('migrate', 'reusable_app')
这有点乱,但可能值得一试。根据实际情况,您可能还需要运行django.setup()
。