在测试中覆盖Django缓存设置

7
我在我的测试中使用Django DummyCache,但是有一些测试依赖于真正的缓存,因此在这里使用虚拟缓存不好。是否有一种干净的方法可以覆盖特定模块或范围的通用Django设置?最好使用Python装饰器
我正在使用Django版本1.8.4
3个回答

13

9

是的,可以覆盖设置。根据Django文档:Testing

为了测试目的,临时更改设置并在运行测试代码后恢复原始值通常很有用。对于这种情况,Django提供了一个标准的Python上下文管理器... settings(),可以像这样使用:

from django.test import TestCase

class LoginTestCase(TestCase):
    def test_login(self):
        # Override the LOGIN_URL setting
        with self.settings(CACHES={'default': {'BACKEND': 'django.core.cache.backends.dummy.DummyCache'}}):
            response = self.client.get(...)

我已经自己使用了上述方法测试了几个其他设置,但没有使用特定的缓存设置,这是一般的想法。
编辑(由@Alasdair提供):
关于特定的设置覆盖,文档中可以找到以下警告:
更改CACHES设置是可能的,但如果您正在使用使用缓存的内部功能(如django.contrib.sessions),则有点棘手。例如,在使用缓存会话并覆盖CACHES的测试中,您将不得不重新初始化会话后端。

2
覆盖CACHES设置通常是有效的,但有时可能会遇到问题。文档中有警告 - Alasdair

1
如果您正在使用pytest,您可以将此fixture放在您的conftest.py文件中。
from django.core.cache import cache

@pytest.fixture(autouse=True, scope="function")
def reset_cache():
    """
    Fixture to reset the cache after each test
    """
    yield
    cache.clear()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接