4

在我的 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 网站时,我会看到同样的情况。

我怎样才能模拟调用

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 中放置一个 print 语句不会打印任何东西,让我觉得它没有正确模拟

4

1 回答 1

12

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

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

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

希望有帮助。

于 2013-04-06T19:24:12.833 回答