Skip to content

Using Redis in Rust

The redis-rs crate is a great way to interact with an underlying Redis server from a Rust program.

Testing and Mocking

Some important crates come with testing modules such that mocked connections can be created without needed to use an actual server. In this case, it's the redis_test crate.

**Example**

rust
#[cfg(test)]
mod test {
    use super::*;

    use redis::cmd;
    use redis_test::{MockCmd, MockRedisConnection};

    fn new_redis_client(connection: MockRedisConnection) -> Redisclient<MockRedisConnection> {
        Redisclient::new(
            connection,
            "dummy_prefix".to_string(),
            vec!["dummy_topic".to_string()],
        )
    }

    #[test]
    fn test_mock_zrangebyscore() {
        let mock_cmds = vec![MockCmd::new(
            cmd("ZRANGEBYSCORE").arg("topic").arg(5.).arg(15.),
            Ok("v1"),
        )];
        let connection = MockRedisConnection::new(mock_cmds);
        let redis_client = init_redis_client(connection);

        let result = redis_client.get_selection("topic", 5.0, 15.0);

        match result {
            Ok(values) => {
                assert_eq!(values.len(), 1);
                assert_eq!(values, vec!["v1"]);
            }
            Err(_) => panic!("Test failed"),
        }
    }
    #[test]
    fn test_mock zadd() {
        let mock_cmds = vec![MockCmd::new(
            cmd("ZADD").arg("topic").arg(1234.).arg("value"),
            Ok(0),
        )];
        let connection = MockRedisConnection::new(mock_cmds);
        let redis_client = init_redis_client(connection);
        let result = redis_client.add("topic", "value", 1234.);
        assert!(result.is_ok());
    }
}
#[cfg(test)]
mod test {
    use super::*;

    use redis::cmd;
    use redis_test::{MockCmd, MockRedisConnection};

    fn new_redis_client(connection: MockRedisConnection) -> Redisclient<MockRedisConnection> {
        Redisclient::new(
            connection,
            "dummy_prefix".to_string(),
            vec!["dummy_topic".to_string()],
        )
    }

    #[test]
    fn test_mock_zrangebyscore() {
        let mock_cmds = vec![MockCmd::new(
            cmd("ZRANGEBYSCORE").arg("topic").arg(5.).arg(15.),
            Ok("v1"),
        )];
        let connection = MockRedisConnection::new(mock_cmds);
        let redis_client = init_redis_client(connection);

        let result = redis_client.get_selection("topic", 5.0, 15.0);

        match result {
            Ok(values) => {
                assert_eq!(values.len(), 1);
                assert_eq!(values, vec!["v1"]);
            }
            Err(_) => panic!("Test failed"),
        }
    }
    #[test]
    fn test_mock zadd() {
        let mock_cmds = vec![MockCmd::new(
            cmd("ZADD").arg("topic").arg(1234.).arg("value"),
            Ok(0),
        )];
        let connection = MockRedisConnection::new(mock_cmds);
        let redis_client = init_redis_client(connection);
        let result = redis_client.add("topic", "value", 1234.);
        assert!(result.is_ok());
    }
}