一般线上用的缓存都是memcached/redis,django默认对memecached的支持就很方便,在settings.py中进行配置即可。不过同样的缓存配置却不太方便直接用在单元测试中,在测试中,且在测试环境中并无太大必要使用缓存,因此按照django文档可以将缓存配置成,

CACHES = {
  'default': {
      'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
  }
}

如此则在测试代码中就不会因为memcached的配置而出错。不过如果要对读写缓存的逻辑进行测试的话,就需要另外处理了。

简述下目前的土方法,定义测试缓存的基类,

from django.core.cache import cache

class BaseCacheTestCase(TestCase):
    def setUp(self):
        self.cache_dict = {}

        def get(key):
            result = self.cache_dict.get(key)
            return result

        def set(key, value, timeout):
            self.cache_dict[key] = value

        def has_key(key):
            return key in self.cache_dict

        def delete(key):
            if key in self.cache_dict:
                del self.cache_dict[key]

        self.real_get = cache.get
        self.real_set = cache.set
        self.real_has_key = cache.has_key
        self.real_delete = cache.delete

        djcache.get = get
        djcache.set = set
        djcache.has_key = has_key
        djcache.delete = delete

    def tearDown(self):
        djcache.get = self.real_get
        djcache.set = self.real_set
        djcache.has_key = self.real_has_key
        djcache.delete = self.real_delete

在setUp时替换默认缓存接口函数,在tearDown时恢复。后续单独测试缓存的测试用例均继承BaseCacheTestCase。

django默认提供的DummyCache只是实现了缓存接口,实际并未进行任何操作。因此另外也可以手动实现一份,在跑测试用例的时候指定刚定义的缓存实现。不过这样就需要在每一个测试用例的tearDown中清理缓存中的条目,略显麻烦。