如何在Django测试中模拟Redis

4

我正在尝试在我的Django应用程序中模拟redis。我尝试了几种不同的方法,但似乎都没有起作用。我做错了什么?

我的主要redis实例是通过以下方式调用的:

redis_client = redis.from_url(os.environ.get("REDIS_URL"))

该实例被导入到应用程序的其他部分中,以添加和检索数据。

在我的测试中,我尝试执行以下操作:

import fakeredis
from mock import patch

class TestViews(TestCase):
    def setUp(self):
        redis_patcher = patch('redis.Redis', fakeredis.FakeRedis)
        self.redis = redis_patcher.start()

        self.redis.set('UPDATE', 'Spring')
        print(redis_client.get('UPDATE'))

    def tearDown(self):
        self.redis_patcher.stop

在运行测试时,我希望设置“UPDATE”变量。但是,每个redis_client实例都会失败,显示服务器不可用。如何模拟redis并设置值,以便在测试我的应用程序时可用?


1
我是通过Django自带的缓存使用Redis,所以我只需要:@mock.patch('django.core.cache.cache.get')。让一个合适的虚拟Redis运行起来很困难,所以我决定放弃。 - Lauri Elias
1个回答

4

应该在实际使用的地方对项进行模拟,而不是在它所属的地方进行模拟。

因此,如果redis_client在视图中像这样使用:

myapp/views.py

from somemodule import redis_client

def some_view_that_uses_redis(request):
    result = redis_client(...)

然后在您的TestViews中,您应该这样修补redis_client:

class TestViews(TestCase):
    def setUp(self):
        redis_patcher = patch('myapp.views.redis_client', fakeredis.FakeRedis)
        self.redis = redis_patcher.start()

这是我的问题,谢谢。你知道有没有什么方法可以用更少的代码来修补多个视图吗?现在我必须修补5个redis_client实例,每个实例都有自己的redis_patcher1.start(),redis_patcher2.start()等。 - Casey
也许你可以放弃在setUp()tearDown()中的操作,使用@patch('myapp.views.redis_client', fakeredis.FakeRedis)来替换整个TestViews类。每个测试方法都需要接受一个参数来接收已经被修补过的redis。然后他们可以按照自己的需求进行配置,并将任何通用配置委托给一个模块或类级别的函数 - 例如configure_mock_redis(redis) - Will Keeling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接