2013-04-06 84 views
3

在我的settings.py,我指定我的缓存为:蟒蛇Django的模拟缓存

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网站时,我会看到相同的结果。

我如何可以模拟到

get_cache('default').set('key', result) 

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

的呼叫,使得该组的呼叫不设置真正的高速缓存(返回None?),并得到实际不返回任何东西缓存。

请向我提供代码示例以了解如何完成此操作。

这里是我是如何嘲笑我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 /上述设置不打印任何打印语句给我一个想法,它不能正常嘲笑

+0

为什么在生产机器上运行测试? – 2013-04-06 17:02:25

+0

@ kashif,为什么不在运行时使用[dummy cache](https://docs.djangoproject.com/zh/dev/topics/cache/?from=olddocs/#dummy-caching-for-development)测试? – alecxe 2013-04-06 18:55:54

+0

@Alexander,上面在我的实际代码中使用的缓存是文件系统https://docs.djangoproject.com/zh/dev/topics/cache/?from=olddocs/#filesystem-caching。在运行我的测试用例时,如何在'默认'缓存中为'BACKEND'指定另一个值,并确保views.py中的实际代码访问基于文件系统? – kk1957 2013-04-06 19:03:55

回答

9

我认为你应该使用dummy cache而通过运行测试:在测试用例

  • 压倒一切的设置,请参阅docs
  • 检查,而在测试组使用权什么缓存后端tings.py:

    CACHES = ... 
    if 'test' in sys.argv: 
        CACHES['default'] = {'BACKEND': 'django.core.cache.backends.dummy.DummyCache',} 
    
  • 有一个用于测试的独立settings.py
  • 嘲讽,请参阅如何做到这一点

希望有所帮助好article

+0

覆盖缓存工作! – kk1957 2013-04-06 23:30:45