0

I have the the following method in a RedisDriver class:

def get(self, key):
    key_str = str(key)
    try:
        master = self.connection.master_for(self.service)
        value = master.get(key_str)
    except RedisError as err:
        error_str = "Error while retrieving value from redis : " + str(err)
        return {"success": False, "error": error_str}

I want to check is the error message is correct:

I tried the following:

@mock.patch("code.redis_driver.redis_sentinel")
@mock.patch("code.redis_driver.RedisDriver.get", side_effect=RedisError)
def test_redis_driver_delete(mocked_sentinel, mock_redis_sentinel):
    mocked_master = mock.Mock()
    mock_redis_sentinel.master_for.return_value = mocked_master
    redis_driver = RedisDriver(mock_redis_sentinel)
    result = redis_driver.get("test")
    assert result == {"success": False, "error": "test"}

This does not work since an exception is raised:

E               redis.exceptions.RedisError

Since this does not work I try the following:

@mock.patch("code.redis_driver.redis_sentinel")
@mock.patch("code.redis_driver.RedisDriver.get", side_effect=RedisError)
def test_redis_driver_delete(mocked_sentinel, mock_redis_sentinel):
    mocked_master = mock.Mock()
    mock_redis_sentinel.master_for.return_value = mocked_master
    redis_driver = RedisDriver(mock_redis_sentinel)
    with pytest.raises(RedisError) as exception:
        result = redis_driver.get("test")
        assert result == {"success": False, "error": str(exception)}

This always passes, whatever I set result to. How can I catch the expected output?

Data Mastery
  • 1,555
  • 4
  • 18
  • 60

1 Answers1

1

Solved it by mocking the whole class and use side_effect on the get method:

@mock.patch("code.redis_driver.RedisDriver")
def test_redis_driver_delete(mock_redis_sentinel):
    mocked_master = mock.Mock()
    mocked_master.get.side_effect = RedisError("error")
    mock_redis_sentinel.master_for.return_value = mocked_master
    redis_driver = RedisDriver(mock_redis_sentinel)
    result = redis_driver.get("test")
    assert result == {"success": False, "error": "Error while retrieving value from redis : error"}
Data Mastery
  • 1,555
  • 4
  • 18
  • 60