es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Compartir código de prueba común entre múltiples paquetes en Rust.

Tengo una funcionalidad común que quiero reutilizar en pruebas de junit que están en diferentes paquetes y no sé cómo hacerlo. He intentado con diferentes módulos y bibliotecas pero algo no está funcionando. Mi estructura actual se ve más o menos así:

.
├── Cargo.lock
├── Cargo.toml
├── foo
│   └── bar
│       └── baz
│           ├── template
│           │    ├── Cargo.lock
│           │    ├── Cargo.toml
│           │    └── src
│           │        └── tests
│           │            ├── mod.rs
│           │            └── test1.rs
│           │
│           └── template_implementation
│                 ├── Cargo.lock
│                 ├── Cargo.toml
│                 └── src
│                     └── tests
│                         ├── mod.rs
│                         └── test2.rs
│
└── utils
    └── testpackage
        ├── Cargo.toml
        ├── lib.rs
        └── common.rs

Entonces, en common.rs tengo algo como esto:

/// setup para pruebas
pub fn setup() { ... }
pub fn mock_x() { ... }
pub fn mock_y() { ... }

lib.rs se ve así:

#[cfg(test)]
pub mod common;

Quiero usar esas funciones en common.rs en tanto test1.rs como test2.rs. Me aseguré de que las dependencias sean correctas en los archivos de carga, y a pesar de que son “encontradas” por el IDE, tengo un error al hacer cargo test que los métodos no se encuentran en testpackage.

“Funciona” si elimino #[cfg(test)] del mod, pero no quiero que se incluya al hacer cargo build, además obtengo una serie de advertencias al ejecutar las pruebas y ni siquiera compila entonces los artefactos.

Intenté mover common.rs por todas partes, incluso incluirlo en el paquete template, por ejemplo, pero aún así no pude hacer que funcione, enfrento problemas similares. No estoy seguro si me falta alguna anotación o qué, parece un problema muy tonto.

¿Cómo harías algo como esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para utilizar la funcionalidad común en common.rs tanto en test1.rs como en test2.rs, puedes importarla como un módulo en cada uno de los archivos de prueba usando la palabra clave use:

    #[cfg(test)]
    mod tests {
        use super::common::*; // importa el módulo
    
        #[test]
        fn test_something() {
            setup();
            // utiliza las funciones de `common.rs` aquí
        }
    }
    

    Y asegúrate de que el módulo common.rs esté incluido en la biblioteca utils en el archivo Cargo.toml:

    [lib]
    name = "testpackage"
    path = "src/lib.rs"
    
    [dependencies]
    # las dependencias van aquí
    
    [dev-dependencies]
    # las dependencias de desarrollo van aquí
    
    [[test]]
    name = "integration_test_name"
    harness = false
    path = "foo/bar/baz/template/tests/test1.rs"
    
    [[test]]
    name = "integration_test_name"
    harness = false
    path = "foo/bar/baz/template_implementation/tests/test2.rs"
    
    [target.'cfg(test)'.dependencies]
    testproject = { path = "../../utils/testpackage" } # incluye la biblioteca `utils` aquí
    

    De esta manera, el módulo common.rs estará disponible tanto en test1.rs como en test2.rs.

Comments are closed.