4

create の "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

2 に答える 2

5

あなたの問題は、まず、mod relations公開されていないため、クレートの外には表示されず、次に、テストでクレートをインポートしないことです。

Cargo でプログラムをビルドする場合、クレート名は で定義した名前になりますCargo.toml。たとえば、Cargo.toml次のようになっているとします。

[package]
name = "whatever"
authors = ["Chris"]
version = "0.0.1"

[lib]
name = "relations"  # (1)

そして、src/lib.rsファイルにはこれが含まれています:

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();
}
于 2014-10-15T20:03:09.493 に答える
0

crate_id解決策は、src/relations.rs の先頭にa を指定することでした。

#![crate_id = "relations"]
#![crate_type = "lib"]

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

modこれは、含まれているすべてのコードが「関係」モジュールの一部であることを宣言しているように見えますが、これが以前のブロックとどう違うのかはまだわかりません。

于 2014-10-15T19:58:52.887 に答える