代码之家  ›  专栏  ›  技术社区  ›  davidchambers

从Python测试用例中更改“settings”值的最佳方法是什么?

  •  4
  • davidchambers  · 技术社区  · 14 年前

    我第一次用Python为Django应用程序编写单元测试。我遇到了一个问题。为了测试特定功能,我需要更改应用程序设置之一的值。这是我的第一次尝试:

    def test_in_list(self):
        mango.settings.META_LISTS = ('tags',)
        tags = Document(filepath).meta['tags']
        self.assertEqual(tags, [u'Markdown', u'Django', u'Mango'])
    

    META_LISTS 使新值在 Document 对象已创建。相关进口商品是。。。

    # tests.py
    from mango.models import Document
    import mango.settings
    
    # models.py
    from mango.settings import *
    

    如果我理解正确的话 models.py 已从导入名称 mango.settings ,更改的值 芒果。设置 不会改变 在内部 mango.models .

    很可能我在这件事上做的完全错误。在测试用例中改变这样一个“设置”的值的正确方法是什么?

    我没提到档案 py模型

    4 回复  |  直到 14 年前
        1
  •  6
  •   AndrewF    14 年前

    在py模型,使用 import mango.settings . 然后可以像设置其他变量一样在测试代码中设置变量:

    mango.settings.foo = 'bar'
    

    模块是单例的。可以从代码中的任何位置更改其命名空间中的值。

    但是如果你用 from mango.settings import * ,因为该表达式将模块中的值复制到当前命名空间中。

        2
  •  2
  •   Manoj Govindan    14 年前

    在整个测试过程中是否会使用此设置?在这种情况下,一个解决方案是创建一个用于测试的设置文件。例如,添加 settings_for_tests.py

    # settings_for_tests.py
    from settings import * # Get everything from default settings file.
    
    # Override just what is required.
    META_LISTS = ('tags',)
    

    然后运行测试:

    $ python ./manage.py test mango --settings=settings_for_tests
    

    这将确保使用测试设置而不是默认设置来创建测试数据库中的模型。

    project
      |
      |_ settings
      |    |
      |    |_ __init__.py # Contains merely from settings import *
      |    |_ settings.py
      |    |_ settings_for_tests.py
      |
      |_ apps
           |
    
        3
  •  2
  •   Dominik Szopa    14 年前

    为了更改测试用例中的设置,我使用了这个片段的修改版本 http://www.djangosnippets.org/snippets/1011/

    这是我对这个片段的修改 http://github.com/dominno/django-moderation/blob/master/src/moderation/tests/utils/testsettingsmanager.py

    class SerializationTestCase(SettingsTestCase):
        fixtures = ['test_users.json', 'test_moderation.json']
        test_settings = 'moderation.tests.settings.generic'
    
        def setUp(self):
            self.user = User.objects.get(username='moderator')
            self.profile = UserProfile.objects.get(user__username='moderator')
    
        def test_serialize_of_object(self):
            """Test if object is propertly serialized to json"""
    
            json_field = SerializedObjectField()
    
            self.assertEqual(json_field._serialize(self.profile),
                        '[{"pk": 1, "model": "test_app.userprofile", "fields": '\
                        '{"url": "http://www.google.com", "user": 1, '\
                        '"description": "Old description"}}]',
                             )
    

    当测试结束时,很容易恢复它们。

        4
  •  1
  •   S.Lott    14 年前

    有一种更简单的方法。

    使用多个设置文件--每个文件都在适当的配置控制下。

    我们这样做。

    1. settings

    2. 我们将测试脚本分成几个部分。“违约” tests.py 做基本的模型,窗体和视图功能测试,这些测试必须在所有平台,所有开发阶段(开发,测试,qa等)和所有客户上运行。

    3. 我们有单独的单元测试脚本,这些脚本需要对特别复杂的设备进行特殊设置。这些不在里面 测试.py 不要自动运行。它们需要显式调用Django的实用程序来设置和删除测试环境。

    看到了吗 http://docs.djangoproject.com/en/1.2/topics/testing/#module-django.test.utils


    如何推荐测试一个愚蠢的函数,当某个特定设置为真时返回“hello”,错误时返回“goodbye”

    这可能是设计不良的迹象。测试驱动设计(TDD)建议您应该设计这样的设计,这样它就可以在没有复杂复杂设置的情况下进行测试。

    必须 每一个 框架的特点。

    你应该有一个接受 settings.SOME_SETTING 作为一个参数,这样您就可以将它作为一个独立的单元进行测试,而不必为整个环境的正确性而烦恼。你必须相信,环境和框架确实有效。