簡體   English   中英

在同一個python函數中模擬兩個具有不同返回值的redis hget

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM