Como importar funções de `src` para testes? [duplicado]
Eu tenho tentado entender como importar funções para teste no Rust por horas sem sucesso. Eu tenho uma estrutura de projeto que se parece com esta:
.
├── Cargo.lock
├── Cargo.toml
├── src
│ ├── main.rs
│ └── funcs
│ ├── mod.rs
│ └── hello.rs
└── tests
└── test_hello.rs
src/funcs/mod.rs:
pub mod hello;
src/funcs/hello.rs:
pub fn hello() {
println!("{}", "hello!");
}
src/main.rs:
mod funcs;
fn main() {
funcs::hello::hello(); // this works
}
src/tests/test_hello.rs
mod funcs; // this import does not work!
#[test]
fn add() {
assert_eq!(2 + 2, 4);
}
#[test]
fn hello_test() {
assert_eq!(funcs::hello::hello(), "hello");
}
Como posso importar funções públicas srcpara que possam ser usadas em meu diretório de teste?
Respostas
Crie um src/lib.rsarquivo para colocar a maior parte da lógica do seu pacote em uma caixa de biblioteca e exporte o funcsmódulo lá:
pub mod funcs;
Agora use a biblioteca (que contém o módulo) de onde quiser. No seu caso, de src/main.rse tests/test_hello.rs:
use <crate>::funcs;
Substitua <crate>pelo nome da caixa da biblioteca, que é o mesmo que o nome do pacote e a pasta raiz.
Uma caixa Rust pode conter um programa e / ou uma biblioteca. Os testes podem acessar apenas uma biblioteca, não um programa (e apenas as partes públicas da biblioteca). No seu caso, você tem apenas um programa, então não pode fazer testes. Para que os testes funcionem, você precisará:
- Divida seu código em um programa (no
main.rsarquivo) e uma biblioteca (nolib.rsarquivo). - Certifique-se de que qualquer parte da biblioteca que você deseja usar no programa seja pública.
- Certifique-se de que qualquer parte da biblioteca que você deseja testar também seja pública.
- Em
main.rse nos testes, escrevause foo::hellopara acessar ahellofunção, substituindofoopelo nome da sua biblioteca.
Se você quiser dividir o código em módulos, declare cada módulo com pub mod mod_namein lib.rse importe-os com use foo::mod_name;in main.rsou nos testes.
O Rust considera os testes como parte de uma caixa separada, então você deve colocar use your_crate_name::funcs;no topo de seus testes, onde your_crate_nameestá o nome da caixa do seu pacote principal, conforme definido em Cargo.toml.