2016-06-03 13 views
-1

Ich habe eine kleine Mathe-Bibliothek mit einer Verzeichnisstruktur erstelltUnit-Tests mit Rust

mathslib ->src ->lib.rs -> Wandlungen/stats/trig/Basen

Alle Module sind deklariert als pub und die Funktionen auch als pub.

Ich habe den folgenden Test für nur eine Funktion geschrieben, aber wenn ich cargo test ausführen, bin ich mit einem Fehler konfrontiert, dass die Funktion nicht gelöst werden kann (E0425).

extern crate MathsLib; 

use MathsLib::Conversions::Temperature; 

#[cfg(test)] 
mod TemperatureTests { 
    #[test] 
    fn test_kelvin_to_celcius_pass() { 
     let calc = kelvin_to_celcius(14.5); 
     assert_eq!(calc.0, true); 
    } 

    #[test] 
    #[should_panic(expected = "assertion failed")] 
    fn test_kelvin_to_celcius_fail() { 
     let calc = kelvin_to_celcius(-4f32); 
     assert_eq!(calc.0,true); 
    } 
} 

Von was ich aus der Dokumentation sehen kann, sollte dies in Ordnung sein - aber es ist offensichtlich nicht.

Die fragliche Funktion sieht wie folgt aus

pub fn kelvin_to_celcius(k: f32) -> (bool, f32) 
{ 
    if k < 0f32 
    { 
     return (false, k); 
    } 
    else 
    { 
     return (true, k - 273.15); 
    } 
} 
+2

Können Sie bitte ein vollständiges Beispiel einschließlich der tatsächlichen Fehlermeldung enthalten? –

Antwort

2

Ihre Funktionen sind in ihrem Umfang nicht.

Layout Ihr Modul Unter der Annahme, ist wie folgt:

pub fn kelvin_to_celcius(k: f32) -> (bool, f32) 
{ 
    if k < 0f32 
    { 
     return (false, k); 
    } 
    else 
    { 
     return (true, k - 273.15); 
    } 
} 

#[cfg(test)] 
mod TemperatureTests { 
    ... 
} 

Dann werden Sie die Funktion in Rahmen für Ihren Testmodul mitbringen müssen. Der idiomatische Weg, dies zu tun, ist wie folgt:

#[cfg(test)] 
mod TemperatureTests { 
    use super::*; // <--- use everything declared in the parent module 
    ... 
} 

Dies ermöglicht es alles in dem umschließenden Modul ohne Qualifikation in Ihrem Testmodul verwendet werden.

Alternativ wäre Sie in der Lage Ihre Anrufe für die Methode, dies zu ändern:

let calc = super::kelvin_to_celcius(-4f32); // <-- note, "super" .. you want to go into the outer scope to find the method 
assert_eq!(calc.0,true); 
1

use MathsLib::Conversions::Temperature; fügt das Temperature Symbol des Moduls Umfang, aber es ist nicht der Symbole in der Temperature hinzufügen Modul. Wenn Sie das tun möchten, müssen Sie dies stattdessen schreiben:

use MathsLib::Conversions::Temperature::*;