問題

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

など、ハマる人が多い様子。

bannerAds