是否有任何简单的机制可以覆盖Django单元测试的设置?我在一个模型上有一个经理,该经理返回特定数量的最新对象。它返回的对象数由NUM_LATEST设置定义。
如果有人更改设置,这可能会使我的测试失败。如何覆盖设置setUp()并随后恢复设置tearDown()?如果不可能,是否可以通过某种方式猴子修补方法或模拟设置?
setUp()
tearDown()
编辑:这是我的经理代码:
class LatestManager(models.Manager): """ Returns a specific number of the most recent public Articles as defined by the NEWS_LATEST_MAX setting. """ def get_query_set(self): num_latest = getattr(settings, 'NEWS_NUM_LATEST', 10) return super(LatestManager, self).get_query_set().filter(is_public=True)[:num_latest]
管理器用于settings.NEWS_LATEST_MAX切片查询集。该getattr()只是用来提供一个默认的应该设置不存在。
settings.NEWS_LATEST_MAX
getattr()
编辑:如果你想改变设置了这样的回答适用于小数量的特定测试。
从Django 1.4开始,有多种方法可以在测试期间覆盖设置:https : //docs.djangoproject.com/en/dev/topics/testing/tools/#overriding-settings
TestCase将具有一个self.settings上下文管理器,并且还将有一个@override_settings装饰器,可将其应用于测试方法或整个TestCase子类。
这些功能在Django 1.3中尚不存在。
如果要更改所有测试的设置,则需要创建一个单独的测试设置文件,该文件可以加载和覆盖主设置文件中的设置。在其他答案中,有几种不错的方法;我看到的这两个成功的变化hspander的和德米特里的方法。