一尘不染

如何在Django中使用不同设置进行单元测试?

django

是否有任何简单的机制可以覆盖Django单元测试的设置?我在一个模型上有一个经理,该经理返回特定数量的最新对象。它返回的对象数由NUM_LATEST设置定义。

如果有人更改设置,这可能会使我的测试失败。如何覆盖设置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()只是用来提供一个默认的应该设置不存在。


阅读 344

收藏
2020-03-29

共1个答案

一尘不染

编辑:如果你想改变设置了这样的回答适用于小数量的特定测试。

从Django 1.4开始,有多种方法可以在测试期间覆盖设置:https : //docs.djangoproject.com/en/dev/topics/testing/tools/#overriding-settings

TestCase将具有一个self.settings上下文管理器,并且还将有一个@override_settings装饰器,可将其应用于测试方法或整个TestCase子类。

这些功能在Django 1.3中尚不存在。

如果要更改所有测试的设置,则需要创建一个单独的测试设置文件,该文件可以加载和覆盖主设置文件中的设置。在其他答案中,有几种不错的方法;我看到的这两个成功的变化hspander的和德米特里的方法。

2020-03-29