python django模拟缓存

kk1*_*957 4 python django caching mocking

在我的settings.py中,我将缓存指定为:

 CACHES = {
    'default': {
     ......
   }
}
Run Code Online (Sandbox Code Playgroud)

在我的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')
Run Code Online (Sandbox Code Playgroud)

现在在我的tests.py中,我已经能够模拟requests.get('aurl'),这样就可以确保没有外部请求.

但是测试代码仍然会访问缓存并从中获取/设置.因此,如果我的prod已经设置了缓存,则测试失败,因为它从相同的缓存中获取数据.或者,如果我首先运行我的测试,那么测试用例是使用测试数据设置缓存,并且当我运行prod网站时,我看到相同的情况.

我该如何模拟调用

get_cache('default').set('key', result) 
Run Code Online (Sandbox Code Playgroud)

get_cache('default').get('key') 
Run Code Online (Sandbox Code Playgroud)

这样set set不会设置真正的缓存(返回None?)并且get不会返回实际缓存中的任何内容.

请向我提供如何完成此操作的代码示例.

这是我如何模仿我的请求

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

我可以在此之后添加什么代码才能使其正常工作?我试过类似的东西

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)
Run Code Online (Sandbox Code Playgroud)

但它不起作用,并在上面的get/set中放置一个print语句不会打印出任何让我知道它没有被嘲笑的东西

ale*_*cxe 12

我认为你应该在运行测试时使用虚拟缓存:

  • 覆盖测试用例中的设置,请参阅docs
  • 在settings.py中测试时检查要使用的缓存后端:

    CACHES = ...
    if 'test' in sys.argv:
        CACHES['default'] = {'BACKEND': 'django.core.cache.backends.dummy.DummyCache',}
    
    Run Code Online (Sandbox Code Playgroud)
  • 有一个单独的settings.py进行测试
  • 嘲笑,看看如何做的好文章

希望有所帮助.