在Python测试案例中更改“settings”值的最佳方法是什么?
我第一次在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 个回答
这个设置会在所有测试中使用吗?如果是这样的话,一个解决办法就是为测试创建一个设置文件。比如,可以添加一个 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
|
为了在测试案例中更改设置,我使用了这个代码片段的修改版,链接在这里: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"}}]',
)
这样做可以记录下原来的设置,并在测试结束后轻松地恢复到原来的状态。
在models.py文件中,使用import mango.settings
。这样你就可以像设置其他变量一样,在测试代码中设置一个变量:
mango.settings.foo = 'bar'
一个模块是单例的。这意味着你可以在代码的任何地方更改它的值。
但是,如果你使用from mango.settings import *
,这个方法就不行了,因为它会把模块里的值复制到当前的命名空间中。