問題
Rustでmain.rsベースのプロジェクトのインテグレーションを書こうと思っても、インテグレーションテストからテスト対象のコードを参照できない。
解決方法
main.rsをlib.rsにリネームする
main.rsファイルをlib.rsと同じディレクトリに作る
lib.rsからmain.rsにmain()を移す
lib.rsにエントリーポイントとなる関数を作る
main.rsからlib.rsのエントリーポイントを呼ぶ(main.rsからlib.rsの関数やモジュールはクレート名で参照できる)
例えば、
// Cargo.toml
[package]
name = "dolce"
// src/and.rs
pub fn gabbana() {}
// src/lib.rs
mod and;
pub use and; // インテグレーションテストから使えるように再エクスポート(未確認)
pub fn entry_point() {}
だったら、
// src/main.rs
fn main() {
dolce::and::gabbana();
dolce::entry_point();
}
のようにしておく。すると、testsディレクトリ下のインテグレーションテストからも、dolce::and::gabbana()の様にテスト対象のコードを参照できる。
余談
rust by exampleのインテグレーションテストの説明
https://doc.rust-lang.org/rust-by-example/testing/integration_testing.html
では、バイナリープロジェクトをインテグレーションテストするケースについては全く触れられていないので、
https://github.com/rust-lang/cargo/issues/7885
など、ハマる人が多い様子。