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

5 投票
4 回答
3519 浏览
提问于 2025-04-16 04:48

我第一次在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.settings中改变META_LISTS的值并不会改变mango.models中的META_LISTS的值。

我可能完全走错了方向。那么,从测试用例中正确地改变这种“设置”的值应该怎么做呢?

编辑:我没提到models.py文件实际上包含的是普通的Python类,而不是Django模型。我确实需要重命名这个文件!

4 个回答

2

这个设置会在所有测试中使用吗?如果是这样的话,一个解决办法就是为测试创建一个设置文件。比如,可以添加一个 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
       |
2

为了在测试案例中更改设置,我使用了这个代码片段的修改版,链接在这里: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"}}]',
                         )

这样做可以记录下原来的设置,并在测试结束后轻松地恢复到原来的状态。

6

在models.py文件中,使用import mango.settings。这样你就可以像设置其他变量一样,在测试代码中设置一个变量:

mango.settings.foo = 'bar'

一个模块是单例的。这意味着你可以在代码的任何地方更改它的值。

但是,如果你使用from mango.settings import *,这个方法就不行了,因为它会把模块里的值复制到当前的命名空间中。

撰写回答