在同一个 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 我一直在寻找的答案:)
我有一些这样的代码:
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 我一直在寻找的答案:)