## 概要
仕様上、[[Rustのバイナリクレートには結合テストを書けない]]。が、動作保証をするためにテストを書きたい。
## 解決方法
処理のほぼすべてを[[ライブラリクレート]]に記述し、[[バイナリクレート]]を薄いラッパーとして利用すれば、必要な結合テストはほぼ作成できる。
以下は具体例。
```console
src
├── lib.rs
└── main.rs
tests
└── integration_test.rs
```
`src/lib.rs`
```rust
// 通常は沢山のmoduleを利用する
use std::error::Error;
pub fn run() -> Result<(), Box<dyn Error>> {
// CLIだったらコマンドパーススタートの関数、APIならAPIスタートの関数など
Ok(())
}
```
`src/main.rs`
```rust
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
// libクレートのスタート処理を呼び出すだけの薄いラッパー
bintest_sample::run()
}
```
`tests/integration_test.rs`
```rust
use bintest_sample::run;
use std::error::Error;
#[test]
fn it_pass() -> Result<(), Box<dyn Error>> {
run()?;
Ok(())
}
```
## 参考
- [テストの体系化 \- The Rust Programming Language 日本語版](https://doc.rust-jp.rs/book-ja/ch11-03-test-organization.html#%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%82%AF%E3%83%AC%E3%83%BC%E3%83%88%E7%94%A8%E3%81%AE%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88)