2015-09-09 1 views
5
mod simulation; 

use simulation::factory::FactoryType; 

отлично работает в main.rs, но не в doctest внутри simulation/factory.rs:Как я могу использовать собственный модуль внутри досье?

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

cargo test дает мне ошибку

---- 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 

Как я могу получить doctests работать?

+1

Если вы создаете двоичный файл (например, если у вас есть 'src/main.rs' вместо' src/lib.rs'), вы не можете использовать функции из него в doctest: doc tests импортирует ящики из библиотеки (если она одна). – huon

+0

Пожалуйста, найдите время, чтобы создать [MCVE] (/ help/mcve) при обращении за помощью. Поскольку вы в настоящее время задали свой вопрос, нам нужно много догадываться, чтобы точно знать, что существует. – Shepmaster

ответ

6

Когда вы пишете doc-тест, вы должны действовать как пользователь вашего кода. Учитывая эти файлы:

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()); 
} 

Все работает. Обратите внимание, что в main.rs, вы должны сказать extern crate, тогда все ваши ссылки должны включать имя ящика. Договор остается тем же, за исключением того, что extern crate автоматически включается для вас.

3

Как отметил huon-dbaupp, ящики для ящиков не могут быть импортированы из тестов doc.

Решение состоит в том, чтобы определить большую часть вашего кода как библиотечный ящик и иметь один бинарный файл, который является оболочкой.

В качестве примера используется racer.

+0

То же самое было с C#, пока они не исправили его для тестов в exes. Приходите на ржавчину, удалите gotchas. – Squirrel

 Смежные вопросы

  • Нет связанных вопросов^_^