【问题标题】:How to to override database settings in a Django TestCase如何覆盖 Django TestCase 中的数据库设置
【发布时间】:2015-08-10 15:37:47
【问题描述】:

我正在为 Django 应用程序编写测试用例。我想为不同的测试用例使用不同的数据库。因此,我想覆盖特定测试用例的默认数据库设置。

例如

class FooTest(TestCase):
    fixtures = ['df_fixtures1.json']

    def setUp(self):
        print "SETTING UP?"

    def tearDown(self):
        print "Tear Down"

    @override_settings(DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'})
    def do_foo_related(self):
        Foo task.....
        pass

这不起作用,但这就是我想要的。有没有办法做这样的事情?

编辑:我正在使用 django1.5

【问题讨论】:

    标签: django unit-testing django-database


    【解决方案1】:

    理想情况下,您应该像这样定义一个test_settings.py 文件

    from settings import *
    ......
    override whatever you want here
    ......
    

    然后把manage.py改成这样的

    #!/usr/bin/env python
    import os
    import sys
    
    
    if __name__ == "__main__":
        test_settings = 'test_settings'
        settings = test_settings if 'test' in sys.argv else   'settings'
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", settings)
    
        from django.core.management import execute_from_command_line
        execute_from_command_line(sys.argv)
    

    这将确保测试用例仅使用您的 test_settings 运行,以避免对主数据库产生任何副作用。

    【讨论】:

      【解决方案2】:

      您需要覆盖 _pre_setup 和 _post_teardown 方法。事实上,有一个用于完全相同目的的 python 包,它为使用 Django 的不同数据库提供测试支持。如果它符合您的目的,您可以使用它,否则它无论如何都可以用作参考。

      Pypi 链接:-

      Django Test Addons

      文档:-

      Python Hosted

      Read the docs

      【讨论】:

      • 一个很棒的答案,但不幸的是我不能使用这个包,因为它不支持 django 1.5。
      • 它可能适用于 django 1.5,因为 django 1.6 中的 TestCase 类没有太多变化,所以试一试。从文档中引用“软件包可能适用于比指定的旧版本。只是它没有经过测试。所以请随意尝试一下。”
      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 2017-06-12
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多