![](/img/trans.png)
[英]mutiple calls with same args to python function outputs different return values
[英]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模擬一個返回值。 在我當前的代碼中, var_b
返回值將替換var_b
,因此,在測試用例運行時,它會使var_a
成為相同的值,從而導致代碼沿返回的狀態碼返回,返回的status_code為400。
做這種事情的正確方法是什么?
好的,我在這里找到了答案: Python模擬了多個返回值
這個問題的可接受答案是我正在尋找的東西,這是使用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://stackoverflow.com/users/100297/martijn-pieters為我一直在尋找的答案:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.