Error al utilizar la macro assert_eq en Rust

Publicado por Brisa
hace 2 meses

Hola a todos,

Estoy teniendo un problema al utilizar la macro assert_eq en Rust y me preguntaba si alguien puede ayudarme a resolverlo.

Estoy escribiendo pruebas unitarias para una función que compara dos estructuras de datos. Quiero verificar que los dos valores sean iguales utilizando la macro assert_eq, pero obtengo un mensaje de error que no puedo resolver.

Aquí está mi código:

#[derive(Debug, PartialEq)]
struct Point {
    x: i32,
    y: i32,
}

fn compare_points(a: Point, b: Point) -> bool {
    a == b
}

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

    #[test]
    fn test_compare_points() {
        let point1 = Point { x: 1, y: 2 };
        let point2 = Point { x: 1, y: 2 };
        assert_eq!(compare_points(point1, point2), true);
    }
}

El error que obtengo es el siguiente:

assertion failed: `(left == right)`
  left: `false`,
 right: `true`

He verificado las estructuras de datos y parecen ser idénticas, por lo que no entiendo por qué assert_eq me devuelve false. ¿Alguien sabe qué estoy haciendo mal? ¿Hay alguna otra manera de comparar estructuras de datos en Rust?

Gracias de antemano por su ayuda.

rust
Respuesta de Gordon Shumway
hace 2 meses

¡Hola Brisa!

Por el mensaje de error que mencionas, parece que la macro assert_eq! está funcionando correctamente, pero el resultado de la función compare_points es false cuando esperabas que fuera true. Dado que has implementado la derivación de PartialEq para tu estructura Point, no deberías necesitar una función separada para comparar dos puntos, ya que la comparación se puede hacer directamente con el operador ==.

Por lo tanto, el problema no está en assert_eq! sino en cómo estás utilizando los puntos en tu prueba unitaria. En tu función de prueba, le pasas point1 y point2 a compare_points, y ambos puntos son consumidos en el proceso, es decir, después de la llamada a compare_points(point1, point2), point1 y point2 ya no estarán disponibles ya que no implementas Copy en tu estructura Point.

Sin embargo, según el código que has proporcionado, esto no debería ser un problema ya que no intentas usar point1 y point2 después de la llamada a la función. El verdadero problema es que assert_eq! está haciendo exactamente lo que debería, ya que la función compare_points está devolviendo false por alguna razón desconocida, ya que según tus estructuras, debería devolver true.

Mi sugerencia es que simplifiques la prueba eliminando la función compare_points y utilizando directamente el operador == para comparar los puntos, así:

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

    #[test]
    fn test_compare_points() {
        let point1 = Point { x: 1, y: 2 };
        let point2 = Point { x: 1, y: 2 };
        assert_eq!(point1, point2);
    }
}

Si ahora obtienes el error, sería muy extraño, y deberíamos revisar si hay algo más en tu código que no has mostrado que podría estar interfiriendo. Asegúrate también de que tu código no tenga modificaciones no deseadas o efectos secundarios en alguna otra parte del mismo.

Si aún así el problema persiste, podrías proporcionarme el mensaje de error completo o revisar si hay más contexto que pudiese afectar el resultado de tu prueba unitaria. Pero con el código que has mostrado, y asumiendo que ese es el código completo relevante para la prueba, el reemplazo que te he propuesto debería pasar la prueba sin problemas.