3.7 La prueba se muda
Esta traducción fue asistida por IA y revisada superficialmente. Si encuentras errores o algo no suena natural, escríbeme — lo agradezco.
Un test que vive separado de lo que prueba sigue siendo un test. Esto suele llamarse organización. La palabra exacta es proximidad accidental.
Lo que necesitas
Catorce tests viven en src/main.rs - porque cuando se escribieron no había otros archivos.
Ahora sí los hay. Un test de tarea debería vivir junto a la tarea; un test del almacén junto
al almacén.
Hay también una razón práctica: un test como submódulo ve los detalles privados de su padre.
Un test que vive en main.rs ve solo lo que está expuesto al exterior. Un test que vive
dentro de su módulo lo ve todo.
El traslado
En el capítulo 3.6, el módulo de tareas es el archivo src/task.rs. Para darle un submódulo
con tests, el archivo se convierte en un directorio: src/task.rs se renombra a
src/task/mod.rs. Para el compilador y main.rs, nada cambia - mod task; funciona igual
con ambos.
Añade una línea al final de src/task/mod.rs:
// src/task/mod.rs - añadir al final
#[cfg(test)]
mod tests;
#[cfg(test)] es un atributo de compilación condicional: el módulo tests se incluye solo
al ejecutar cargo test. mod tests; apunta al compilador hacia src/task/tests.rs.
Crea src/task/tests.rs. Dentro - el cuerpo del módulo tests:
// src/task/tests.rs - NUEVO
use super::*;
#[test]
fn new_task_starts_as_todo() {
let task = Task::new(1, "Buy coffee").unwrap();
assert!(!task.is_done());
}
#[test]
fn task_display_todo() {
let task = Task::new(1, "Buy coffee").unwrap();
assert_eq!(format!("{}", task), "#1: Buy coffee [Todo]");
}
Los siete tests de tarea restantes se mueven allí con el mismo principio - cada uno sin cambios.
super aquí es el módulo task. use super::* trae todos los nombres de task/mod.rs al
ámbito - tanto públicos como privados: un módulo hijo ve todo lo que tiene el padre. Si
task/mod.rs ya tiene use std::fmt o use crate::error::TqError, están disponibles en
tests.rs sin repetir la importación. Por eso exactamente los tests viven dentro, no fuera.
src/store.rs y src/error.rs se renombran del mismo modo - a src/store/mod.rs y
src/error/mod.rs. Cada uno recibe #[cfg(test)] mod tests; al final.
src/store/tests.rs necesita una importación extra: TqError vive en un módulo diferente
y use super::* no lo traerá:
// src/store/tests.rs - NUEVO
use super::*;
use crate::error::TqError;
#[test]
fn store_assigns_sequential_ids() {
let mut store = TaskStore::new();
store.add("A").unwrap();
store.add("B").unwrap();
assert_eq!(store.all()[0].id, 1);
assert_eq!(store.all()[1].id, 2);
}
Los dos tests del almacén restantes se mueven allí también.
El bloque entero #[cfg(test)] mod tests { ... } se elimina de src/main.rs.
El resultado
running 14 tests
test error::tests::error_display_empty_title ... ok
test error::tests::error_display_not_found ... ok
test store::tests::store_assigns_sequential_ids ... ok
test store::tests::store_get_mut_completes_task ... ok
test store::tests::store_get_returns_not_found ... ok
test task::tests::complete_marks_task_done ... ok
test task::tests::new_task_accepts_valid_title ... ok
test task::tests::new_task_rejects_empty_title ... ok
test task::tests::new_task_starts_as_todo ... ok
test task::tests::str_converts_into_task ... ok
test task::tests::task_display_done ... ok
test task::tests::task_display_todo ... ok
test task::tests::task_from_str_sets_title ... ok
test task::tests::task_id_is_preserved ... ok
test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Catorce tests - los mismos que antes. Solo que ahora cada uno sabe dónde vive.
make ci pasa.
El código completo de
tqpara este capítulo está en3-a-voice/07-the-proof-moves-in/.