Easier use fakeredis in Django.
pip install django-fakeredis
I have experienced many times to find bugs which is caused by mutiple fakeredis instances in tests. We just want to use fakerredis like redis with one redis-server and different connections and can debug with MONITOR command in redis
- One fakeredis server with mutiple connections for tests like the way of using redis.
- Combine override settings to Local-memory and fake get_redis_connection, django's cache
- To disable the fake action with passing env: "NOFAKE_REDIS=1"
NOFAKE_REDIS=1 python manage.py test
Before you use django_fakeredis
, your tests code maybe like that:
server = fakeredis.FakeServer()
@override_settings(CACHES={"default": {"BACKEND": "django.core.cache.backends.dummy.DummyCache" }})
@patch('foo.get_redis_connection', fakeredis.FakeRedis(server=server)
def test_sth():
....
Now your can just:
@FakeRedis("yourpath.get_redis_connection")
def test_sth():
...
from django_fakeredis import FakeRedis
@FakeRedis("yourpath.get_redis_connection")
def test_foo():
...
from django_fakeredis import FakeRedis
with FakeRedis("yourpath.get_redis_connection"):
foo()
from django_fakeredis import FakeRedis
with FakeRedis("yourpath.cache"):
foo()
- If you want to mock
django.core.cache.cache
with fakeredis, django-fakeredis do nothing but just override CACHE settings into Local-Memory for using the internal cast. So there are two mocked redis instance for django.cache and get_redis_connection .
If you want to use more redis commands, such as: sets, list..., you may need use django_redis, and cast the result by hand.
django.cache:
from django.core.cache import cache
cache.set("key", 2)
assert cache.get("key") == 2
you have to cast by hand, when using fakeredis or django_redis directly, you have to cast by hand:
import fakeredis
con = fakeredis.FakeStrictRedis()
con.set("key", 2)
assert con.get("key").decode('utf8') == "2"
- if you have a problem that mock is not worked, you may should to see where to patch