在我的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'),这样就确保没有外部请求。
但测试代码仍会点击缓存并从中获取/设置。因此,如果我的prod已经设置了缓存,则测试失败,因为它从相同的缓存中获取数据。或者,如果我先运行我的测试,那么测试用例是使用测试数据设置缓存,我看到在运行prod网站时反映出来的情况。
如何模拟对
的调用get_cache('default').set('key', result)
和
get_cache('default').get('key')
这样set set不会设置真正的缓存(返回None?)并且get不会返回实际缓存中的任何内容。
请向我提供如何完成此操作的代码示例。
以下是我嘲笑我的请求.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中放置一个print语句并不会打印任何让我知道它没有被正确嘲笑的东西
答案 0 :(得分:11)
我认为你应该在运行测试时使用dummy cache:
检查在settings.py中测试时要使用的缓存后端:
CACHES = ...
if 'test' in sys.argv:
CACHES['default'] = {'BACKEND': 'django.core.cache.backends.dummy.DummyCache',}
希望有所帮助。