2013-04-06 61 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