2015-09-09 15 views
5
mod simulation; 

use simulation::factory::FactoryType; 

hoạt động tốt trong main.rs, nhưng không phải trong một doctest bên simulation/factory.rs:Tôi làm cách nào để sử dụng mô-đun tùy chỉnh bên trong tài liệu?

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

cargo test mang lại cho tôi những lỗi

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

Làm thế nào tôi có thể nhận được doctests để làm việc?

+1

Nếu bạn đang tạo một tệp nhị phân (ví dụ: nếu bạn có 'src/main.rs' thay vì' src/lib.rs') thì bạn không thể sử dụng các hàm từ nó trong doctest: doc tests import thùng họ là từ một thư viện (nếu nó là một). – huon

+0

Hãy dành thời gian để tạo [MCVE] (/ help/mcve) khi yêu cầu trợ giúp. Như bạn đã nói câu hỏi của bạn, chúng tôi phải làm rất nhiều đoán để biết chính xác những gì tồn tại. – Shepmaster

Trả lời

6

Khi bạn viết bài kiểm tra tài liệu, bạn phải hoạt động với tư cách người dùng mã của bạn sẽ. Với những tập tin này:

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

Tất cả mọi thứ hoạt động. Lưu ý rằng trong main.rs, bạn phải nói extern crate, thì tất cả các tham chiếu của bạn cần phải bao gồm tên thùng. Doctest là như nhau, ngoại trừ extern crate được tự động đưa vào cho bạn.

3

Như đã lưu ý huon-dbaupp, thùng rác không thể được nhập từ các bài kiểm tra tài liệu.

Giải pháp là xác định hầu hết mã của bạn là một thùng thư viện và có một nhị phân chỉ là một trình bao quanh đó.

Ví dụ: racer sử dụng kỹ thuật này.

+0

Điều tương tự cũng đúng với C# cho đến khi chúng cố định nó cho các thử nghiệm trong exes. Thôi đi, loại bỏ các gotchas. – Squirrel

Các vấn đề liên quan