在同一个 python 函数中模拟两个具有不同 return 值的 redis hgets

Mocking out two redis hgets with different return values in the same python function

我有一些这样的代码:

import redis

redis_db = redis.Redis(host=redis_host_ip, port=redis_port, password=redis_auth_password)

def mygroovyfunction():
    var_a = redis_db.hget(user, 'something_a')
    var_b = redis_db.hget(user, 'something_b')
    if var_a == something_a:
        return Response(json.dumps({}), status=200, mimetype='application/json')
    if var_b == something_b:
        return Response(json.dumps({}), status=400, mimetype='application/json')

然后在 tests.py 文件中进行单元测试,我有一些这样的代码:

import unittest
from mock import MagicMock, Mock, patch

@patch('redis.StrictRedis.hget', return_value='some value')
class MyGroovyFunctionTests(unittest.TestCase):
    def test_success(self, mock_redis_hget):
        response = self.app.get('mygroovyfunction')
        self.assertEqual(response.status_code, 200)

所以我遗漏了一些其他烧瓶的东西,因为它与这个问题无关。

我想知道是否可以为每个单独的 redis hget 模拟一个 return 值。使用我当前的代码,模拟的 return 值替换 var_b,因此当测试用例运行时,它使 var_a 也成为相同的值,导致代码沿着以return status_code 共 400 个

做这种事情的正确方法是什么?

好的,我在这里找到了答案:Python mock multiple return values

该问题的公认答案是我一直在寻找的,即使用 side_effect 并使其成为一个值列表,因此每个修补的 redis hget 都将被赋予列表中的每个值。所以对于我的例子,解决方案是这样做:

import unittest
from mock import MagicMock, Mock, patch

@patch('redis.StrictRedis.hget', side_effect=['something_a','something_b'])
class MyGroovyFunctionTests(unittest.TestCase):
    def test_success(self, mock_redis_hget):
        response = self.app.get('mygroovyfunction')
        self.assertEqual(response.status_code, 200)

感谢 https://whosebug.com/users/100297/martijn-pieters 我一直在寻找的答案:)