2014-10-15 6 views
1

작성한 "tests"디렉토리에서 내 보낸 라이브러리 함수에 어떻게 액세스합니까?상자의 "tests"디렉토리에서 내 보낸 함수에 어떻게 액세스합니까?

SRC/relations.rs :

#![crate_type = "lib"] 

mod relations { 
    pub fn foo() { 
     println!("foo"); 
    } 
} 

테스트/test.rs :

use relations::foo; 

#[test] 
fn first() { 
    foo(); 
} 
$ cargo test 
    Compiling relations v0.0.1 (file:///home/chris/github/relations) 
/home/chris/github/relations/tests/test.rs:1:5: 1:14 error: unresolved import `relations::foo`. Maybe a missing `extern crate relations`? 
/home/chris/github/relations/tests/test.rs:1 use relations::foo; 
               ^~~~~~~~~ 

나는 extern crate relations 제안 추가하는 경우이 오류는 다음과 같습니다

/home/chris/github/relations/tests/test.rs:2:5: 2:19 error: unresolved import `relations::foo`. There is no `foo` in `relations` 
/home/chris/github/relations/tests/test.rs:2 use relations::foo; 
               ^~~~~~~~~~~~~~ 

테스트하고 싶습니다. relations 이 별도의 tests/test.rs 파일. 이 use 문제를 어떻게 해결할 수 있습니까?

답변

4

귀하의 문제는 먼저 mod relations이 공개되지 않으므로 상자 외부에 보이지 않으며 두 번째로 테스트에서 상자를 가져 오지 않는 것입니다.

화물을 사용하여 프로그램을 작성하는 경우 상자 이름은 Cargo.toml에 정의 된 이름이됩니다. 예를 들어, Cargo.toml은 다음과 같습니다

pub mod relations { // (2); note the pub modifier 
    pub fn foo() { 
     println!("foo"); 
    } 
} 

그런 다음 tests/test.rs이 쓸 수 있습니다 :

extern crate relations; // corresponds to (1) 

use relations::relations; // corresponds to (2) 

#[test] 
fn test() { 
    relations::foo(); 
} 
+0

이 답변이 하나 개 더 수준을하게

[package] name = "whatever" authors = ["Chris"] version = "0.0.1" [lib] name = "relations" # (1) 

그리고 src/lib.rs 파일이 포함 네임 스페이스는 필요한 것보다 중첩되지만 매우 명확하고 유용합니다. 상자 모듈은 그 자체로 적절한 모듈입니까? 또는 상자와 모듈은 네 가지 형태의 네임 스페이스입니까? – fadedbee

+0

@chrisdew, 예, 상자 및 모듈이 다릅니다. 상자는 모듈로 구성됩니다. 각 상자에는 "crate root"라는 이름이없는 이름의 최상위 모듈이 있습니다.이 모듈은 최상위 파일에있는 모든 정의로 구성되며,이 경우에는 lib.rs입니다. 'pub mod relation'과 그 대응 괄호를 제거하고'fn foo()'를 최상위 레벨로 남겨두면 테스트에서'use relations :: relations'에 두 번째'관계'가 필요하지 않습니다. 왜냐하면'fn foo())'는 나무 상자 뿌리에서 살 것입니다. –

+0

크레이트는 컴파일 단위이며 모듈은 코드를 구조화하기위한 논리 단위입니다. 이것이 예를 들어 동일한 크레이트에서 모듈간에 상호 종속성을 가질 수 있지만 크레이트간에 상호 종속성을 가질 수없는 이유입니다. –

0

이 솔루션은 SRC/relations.rs의 상단에 crate_id을 지정했다 :

이 모두 포함 된 코드는 "관계"모듈의 일부임을 선언하는 것
#![crate_id = "relations"] 
#![crate_type = "lib"] 

pub fn foo() { 
    println!("foo"); 
} 

, 난 비록 이것이 이전의 mod 블록과 어떻게 다른지 아직 확실하지 않습니다.