使用完全独立于项目的设置进行测试

Posted

技术标签:

【中文标题】使用完全独立于项目的设置进行测试【英文标题】:Using completely project-independent settings for testing 【发布时间】:2012-05-11 03:08:54 【问题描述】:

我正在尝试测试一个在初始化期间创建一些自定义权限的应用。这些是在创建数据库后立即创建的:

custom_permissions = getattr(settings,'SOMEAPP_PERMISSIONS',() )

def create_custom_permissions(sender, **kwargs):
    ct, created = ContentType.objects.get_or_create(model = '',
                                                    app_label = 'some_app',
                                                    defaults = 'name':'some_app')

    for codename, name in custom_permissions: 
        perm = Permission.objects.get_or_create(codename = codename,
                                         content_type__pk = ct.id,
                                         name = name)

post_save.connect(create_custom_permissions, Permission)

我能找到的所有关于覆盖设置的讨论都与override_settingswith self.settings 等有关。但是当我在 TestCase 期间覆盖设置时,我的函数已经运行,设置的更改当然没有效果:

@override_settings(SOMEAPP_PERMISSIONS = (('some_custom_permission','No Name'))
class TestCustomPermissions(TestCase):

    fixtures = ['some_app_user_fixture.json']
    urls = 'some_app.tests.test_urls'

    def test_create_point_privileges(self):
        """ check if all necessary privileges have been created """
        Permission.objects.get(codename = 'some_custom_permission')

因此我所有的测试都失败了。现在我怎样才能使用设置文件来测试这个特殊功能并且它与数据库的创建有关?

【问题讨论】:

【参考方案1】:

从一个 Django 项目到另一个项目,您会看到一个单独的设置模块提供测试配置/覆盖:

# project/settings.py
SOMEAPP_PERMISSIONS = (
    'foo', 'bar'
)

# project/test.py
from project.settings import *

SOMEAPP_PERMISSIONS = (
    'bar', 'baz'
)

您现在要做的就是在运行管理命令时提供设置选项:python ./manage.py test --settings=project.test。它简单、有效且可自我记录。

【讨论】:

已经很有帮助了,但我不能以编程方式强制使用这些设置吗?我更喜欢那个。 因为您听的是signals.post_save 而不是signals.post_syncdb,所以您只需在测试前保存一个Permission 对象,它就会通过。 SOMEAPP_PERMISSIONS += ('bar', 'baz') 非常适合您,并且总有一种方法可以避免在测试运行程序收集结果时动态配置项目配置。如果您正在收听signals.post_syncdb,您甚至必须在setup()/teardown() 中使用设置覆盖/回滚来运行management.call_command('syncdb'),我相信您会在团队中失去粉丝!跨度> 不,这是行不通的,因为custom_permissions=getattr(settings,'SOMEAPP_PERMISSIONS',()) 行在函数之外并且在加载模块时被初始化一次。所以它会返回(),即使我同时覆盖了设置。看起来这很棘手...... 没有什么可以阻止您在模块中覆盖 custom_permissions 并稍后执行回滚。 是的,会坚持下去的。感谢您的努力。

以上是关于使用完全独立于项目的设置进行测试的主要内容,如果未能解决你的问题,请参考以下文章

2个java项目如何访问一个独立于项目之外的公有文件夹?

等待异步函数完成而不添加回调

使用黑盒测试,测试个人项目——第三周作业

react的项目坑

创建Git独立分支

测试模型