2015-09-09 10 views
5
mod simulation; 

use simulation::factory::FactoryType; 

in main.rs funktioniert gut, aber nicht in einem doctest innen simulation/factory.rs:Wie kann ich ein benutzerdefiniertes Modul in einem Doctest verwenden?

impl product_type::ProductType for FactoryType { 
    /// Lorem Ipsum 
    /// 
    /// # Examples 
    /// 
    /// ``` 
    /// use simulation::factory::FactoryType; 
    /// 
    /// ... 
    /// ``` 
    fn human_id(&self) -> &String { 
     ... 
    } 
} 

cargo test gibt mir den Fehler

---- simulation::factory::human_id_0 stdout ---- 
    <anon>:2:9: 2:19 error: unresolved import `simulation::factory::FactoryType`. Maybe a missing `extern crate simulation`? 
<anon>:2  use simulation::factory::FactoryType; 
       ^~~~~~~~~~ 
error: aborting due to previous error 
thread 'simulation::factory::human_id_0' panicked at 'Box<Any>', /home/rustbuild/src/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libsyntax/diagnostic.rs:192 

Wie kann ich Doctests zur Arbeit?

+1

Wenn Sie eine Binärdatei erstellen (zB wenn Sie 'src/main.rs' anstelle von' src/lib.rs' haben), dann können Sie die Funktionen nicht in einem Doctest verwenden: doc tests importieren Kiste sie sind von als eine Bibliothek (wenn es eine ist). – huon

+0

Bitte nehmen Sie sich die Zeit, um ein [MCVE] (/ help/mcve) zu erstellen, wenn Sie nach Hilfe fragen. Wie Sie gerade Ihre Frage formuliert haben, müssen wir viel raten, um genau zu wissen, was existiert. – Shepmaster

Antwort

6

Wenn Sie einen DOC-Test schreiben, müssen Sie als Benutzer Ihres Codes würde handeln. Vor dem Hintergrund dieser Dateien:

src/lib.rs

pub mod simulation { 
    pub mod factory { 
     pub struct FactoryType; 

     impl FactoryType { 
      /// ``` 
      /// use foo::simulation::factory::FactoryType; 
      /// 
      /// let f = FactoryType; 
      /// assert_eq!(42, f.human_id()) 
      /// ``` 
      pub fn human_id(&self) -> u8 { 41 } 
     } 
    } 
} 

src/main.rs

extern crate foo; 
use foo::simulation::factory::FactoryType; 

fn main() { 
    let f = FactoryType; 
    println!("{}", f.human_id()); 
} 

Alles funktioniert. Beachten Sie, dass Sie in main.rs sagen müssen extern crate, dann müssen alle Ihre Referenzen den Kistennamen enthalten. Der Doctest ist der gleiche, außer dass die extern crate automatisch für Sie enthalten ist.

3

Wie von huon-dbaupp vermerkt, können bin Kisten nicht aus DOC-Tests importiert werden.

Die Lösung besteht darin, den Großteil Ihres Codes als Bibliothekskiste zu definieren und eine Binärdatei zu haben, die nur eine Shell ist.

Zum Beispiel verwendet racer diese Technik.

+0

Das gleiche galt für C#, bis sie es für Tests in exes reparierten. Komm schon Rost, entferne die Fallen. – Squirrel

Verwandte Themen