我m writing some code which retrieves info about installed apps, especially defined models, and then does stuff based on that information, but I
在写一个干净,漂亮的单元测试时遇到了一些问题。有没有办法在单元测试中模拟或添加应用程序,而无需在我的tests文件夹中运行manage.py startproject,manage.py startapp,以便为单元测试提供测试应用程序?
答案 0 :(得分:1)
当然,请尝试以下尺寸:
from django.conf import settings
from django.core.management import call_command
from django.test.testcases import TestCase
from django.db.models import loading
class AppTestCase(TestCase):
'''
Adds apps specified in `self.apps` to `INSTALLED_APPS` and
performs a `syncdb` at runtime.
'''
apps = ()
_source_installed_apps = ()
def _pre_setup(self):
super(AppTestCase, self)._pre_setup()
if self.apps:
self._source_installed_apps = settings.INSTALLED_APPS
settings.INSTALLED_APPS = settings.INSTALLED_APPS + self.apps
loading.cache.loaded = False
call_command('syncdb', verbosity=0)
def _post_teardown(self):
super(AppTestCase, self)._post_teardown()
if self._source_installed_apps:
settings.INSTALLED_APPS = self._source_installed_apps
self._source_installed_apps = ()
loading.cache.loaded = False
您的测试用例看起来像这样:
class SomeAppTestCase(AppTestCase):
apps = ('someapp',)
如果您想知道为什么,我会覆盖_pre_setup()
和_post_teardown()
,因此我无需在super()
和{{{{}}中调用setUp()
1}}在我最后的测试用例中。否则,这就是我从Django的测试运行中退出的。我鞭打它并且它有效,虽然我确信,经过仔细检查,你可以进一步优化它,甚至避免每次调用tearDown()
如果它不会与未来的测试冲突。
所以我似乎已经离开了,认为你需要动态添加新模型。如果您创建的应用程序仅用于测试目的,那么您可以采取以下措施在测试期间将其发现。
在项目目录中,创建一个包含测试设置的syncdb
文件。看起来应该是这样的:
test.py
您现在可以使用from settings import *
# registers test app for discovery
INSTALLED_APPS += ('path.to.test.app',)
运行测试,并且您的应用将位于已安装的应用中。