2

I have some code like this:

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')

And then in a tests.py file for unit testing this, I have some code like this:

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)

So there's some other flask stuff which I left out because it is not relevant for this question.

What I wanted to know was if it is possible to mock a return value for each individual redis hget. With my current code, the mocked return value replaces var_b, and so when the test case runs, it makes var_a also the same value, causing the code to go down the path ending in a return status_code of 400.

What is the proper way to do this kind of thing?

1 Answer 1

2

Ok I found the answer here: Python mock multiple return values

The accepted answer for that question is what I was looking for, which is to use side_effect and make it a list of values and so each patched redis hget will be given each value in the list. So for my example the solution is to do this:

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)

Thanks https://stackoverflow.com/users/100297/martijn-pieters for the answer I was looking for :)

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.