2015-08-01 16 views
5

Ich möchte ein einfaches Hallo Weltprojekt einrichten. Die Komponententests sollten im Verzeichnis test/ wie in the book beschrieben sein. Mein Code ist wie folgt.Wie wird ein Test-Verzeichnis erstellt?

src/main.rs

pub mod player; 

fn main() { 
    println!("Hello, world!"); 
} 

src/player.rs

pub fn rep(arg: i32) -> i32 { 
    arg 
} 

Tests/player.rs

extern crate player; 

#[test] 
fn it_works() { 
    assert_eq!(4, player::rep(2+2)); 
} 

Cargo.toml

[package] 
name = "myapp" 
version = "0.1.0" 
authors = ["My Name <[email protected]>"] 

Ich glaube, der Code für das Buch sehr ähnlich ist. Allerdings cargo test versagt:

tests/player.rs:1:1: 1:21 error: can't find crate for `player` 
tests/player.rs:1 extern crate player; 
       ^~~~~~~~~~~~~~~~~~~~ 
error: aborting due to previous error 

Was ist das Problem? Ich bin völlig verloren.

+0

Sie können den Inhalt Ihrer 'Cargo.toml' Datei hinzufügen; das bestimmt den Namen der Dinge, wo wahrscheinlich dein Problem liegt. –

+0

@DK. Sehen Sie sich meinen Schnitt mit 'Cargo.toml' an. Danke – petrbel

Antwort

6

Es gibt zwei Probleme. Zunächst erstellen Sie eine ausführbare Datei und keine Bibliothek. Sie können also nicht mit dem Ergebnis verlinken, um es zu testen. Zweitens scheinen Sie hinsichtlich des Unterschieds zwischen Modulen und Kisten verwirrt zu sein. Vielleicht möchten Sie die Crates and Modules chapter of the Rust book lesen.

Wenn Sie wollen, dass Typen und Methoden von Ihrer Kiste von außen zugänglich sind, müssen Sie Ihren Code in eine Bibliothek kompilieren. Oft sind ausführbare Dateien in Rust nur dünne Wrapper um eine Bibliothek mit dem gleichen Namen. So könnten Sie haben:

// src/main.rs 
extern crate player; 

fn main() { 
    println!("rep(42): {:?}", player::rep(42)); 
} 

// src/lib.rs 
pub fn rep(arg: i32) -> i32 { arg } 

Dies würde erlauben Sie player::rep zu testen.

Die andere Sache, die Sie tun können, ist nur schreiben Sie den Test neben dem Code, den es testet.

// src/lib.rs 
pub fn rep(arg: i32) -> i32 { arg } 

#[test] 
fn test_rep() { assert_eq!(rep(4), 4); } 
2

Sie kompilieren eine Binärdatei anstelle einer Bibliothek (Kiste). Versuchen Sie, "main.rs" in "lib.rs" umzubenennen.

+0

oh, aber ich beabsichtige, eine binäre, das Ergebnis dieses Projekts sollte eine ausführbare Datei sein ... – petrbel

+2

Tests Verzeichnisse werden verwendet, um Funktion APIs von Bibliotheken zu testen. Da Binärdateien diese nicht haben, ist es in diesem Fall nicht sinnvoll, Testverzeichnisse zu verwenden. Sie möchten interne Testmodule zum Testen von Binärdateien verwenden. – Zarathustra30

Verwandte Themen