使用django unittest中的模型模拟应用程序

时间:2011-02-23 22:19:16

标签: django unit-testing

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,以便为单元测试提供测试应用程序?

1 个答案:

答案 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',) 运行测试,并且您的应用将位于已安装的应用中。