Python Django Mock缓存

5
在我的settings.py文件中,我指定了缓存如下:
 CACHES = {
    'default': {
     ......
   }
}

在我的views.py文件中,我有以下代码:

import requests
from django.core.cache import cache, get_cache

def aview():
    #check cache
    if not get_cache('default').get('key'):
        #make request and save in cache
        result = request.get('some_url')
        get_cache('default').set('key', result)
        return result
    else:
        return get_cache('default').get('key')

现在,在我的tests.py中,我已经能够模拟requests.get('aurl'),这可以确保不进行任何外部请求。
但是测试代码仍然会访问缓存并从中获取/设置内容。因此,如果生产环境已经设置了缓存,那么测试将失败,因为它从同一个缓存中获取数据。或者,如果我先运行我的测试,那么测试用例将使用测试数据设置缓存,并且当我运行生产网站时,我会看到相同的结果。
如何模拟对...的调用?
get_cache('default').set('key', result) 

并且

get_cache('default').get('key') 

为了避免set调用真正的缓存(返回None?),并且get不会在实际缓存中返回任何内容。

请提供代码示例,说明如何完成此操作。

这是我如何模拟requests.get的方法:

def test_get_aview(self):
    with mock.patch('requests.get') as mymock:
        mymock.side_effect = (lambda url: MOCKED_DATA[url])

我应该在此添加哪些代码才能使其工作?我尝试过类似以下的代码
class MockCacheValue(mock.MagicMock):
    def get(self, key):
        print 'here'
        return None
    def set(self, key, value):
        print 'here 2'
        pass

def test_get_aview(self):
        with mock.patch('requests.get') as mymock:
            mymock.side_effect = (lambda url: MOCKED_DATA[url])
            mock.patch('django.core.cache.get_cache', new=MockCacheValue)

但它无法正常工作,在 get/set 函数中添加打印语句并没有输出任何内容,这让我认为它没有被正确地模拟。

你为什么要在生产机器上运行测试? - Daniel Roseman
@kashif,为什么你在运行测试时不使用dummy cache呢? - alecxe
@Alexander,我在实际代码中使用的缓存是文件系统 https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs/#filesystem-caching。当我运行测试用例时,如何为“default”缓存指定另一个“BACKEND”值,并确保views.py中的实际代码仍然访问基于文件系统的缓存? - kk1957
@kashif已经决定回答,请查看。 - alecxe
1个回答

14

我认为你在运行测试时应该使用虚拟缓存,具体操作如下:

  • 在测试用例中覆盖设置,请参阅文档

  • 在settings.py文件中检查测试时要使用的缓存后端:

      CACHES = ...
      if 'test' in sys.argv:
          CACHES['default'] = {'BACKEND': 'django.core.cache.backends.dummy.DummyCache',}
    
  • 为测试使用单独的settings.py文件

  • 模拟,参见关于如何实现的好文章

希望这有所帮助。


https://docs.djangoproject.com/en/1.5/topics/testing/overview/#overriding-settings 是一个失效的链接。 - Mattias Martens
https://docs.djangoproject.com/en/4.1/topics/testing/tools/#overriding-settings 是那个失效链接的当前版本 - 我已经对答案进行了编辑 - 它应该很快被批准。 - ingofreyer
另外,补充一下答案:如果您想关闭缓存,dummy_cache非常好用;如果您想实际测试缓存,我建议使用本地内存缓存https://docs.djangoproject.com/en/4.1/topics/cache/#local-memory-caching - ingofreyer

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