モック関数実装用のcrateに mockallがあります。
mockallで実装できる関数であれば積極的に利用できますが、現状async traitへの対応にやや難があるのと、テスト時にトレイトオブジェクトを渡す必要があり、あらゆる用途に使えるとは言いづらい面もあります。
cfg(debug_assertions)マクロ
cfg(debug_assertions)
マクロを利用すると、ビルドモードに応じてコンパイル対象のコードを切り替えられます。
#[cfg(not(debug_assertions))]
async fn some_api_call() {
// cargo build --release時にコンパイルされる関数
// productionで動作させる実コードを実装
}
#[cfg(debug_assertions)]
async fn some_api_call() {
// releaseモード以外の際にコンパイルされる関数
// テスト用に必要な値を直接返す
}
この挙動を利用すると、cargo test
実行時向けの同名関数を実装できます。
ただし、cargo run
やcargo build
などのデフォルト挙動もdebug_assertions
の方が利用される点には注意が必要です。
not(debug_assertions)
を指定するには、cargo check --release
のようにリリースオプションを付ける必要があります。
環境変数による挙動の切り替え
テストケースの細分化には、 std::envを利用する手があります。
var()
で環境変数を取得し、変数に応じた値を返すことで、各種ケースを再現できます。
テストケースにset_var()
を実装するとケース単位で挙動を制御できます。
⁋ 2021/08/28↻ 2024/12/18
中馬崇尋
Chuma Takahiro
Chuma Takahiro