依存関係のテスト
LT;DR
テストのときには、依存関係に スタブ 関数を用いることで、簡単に差し替えることができる FP の考えかたをテストにも取り入れることで、様々な恩恵を受けられる hr.icon
モックライブラリを使わずとも、代替の依存関係とすり替えできる テスト名に該当する識別子は ` 2 つで囲むことが多い
スペースやピリオドを含んだ識別子を作成できるため
成功
code:fsharp
open NUnit.Framework
let 製品が存在する場合は、検証に成功する() =
// 準備: サービス依存関係のスタブを設定
let checkAddressExists address =
CheckedAddress address
let checkProductCodeExists productCode =
true
// 準備: 入力の設定
let unvalidatedOrder = ...
// 実行: validateOrder を呼び出す
let result = validateOrder checkProductCodeExists checkAddressExists ...
// 検証: 結果がエラーでなく、検証済みの注文であることを確認する
失敗
code:fsharp
let 製品が存在しない場合は、検証に成功する() =
// 準備: サービス依存関係のスタブを設定
let checkAddressExists address = ...
let checkProductCodeExists productCode =
false
// 準備: 入力の設定
let unvalidatedOrder = ...
// 実行: validateOrder を呼び出す
let result = validateOrder checkProductCodeExists checkAddressExists ...
// 検証: 結果が失敗であることを確認する
各関数は ステートレス なので、同じ入力に対して同じ結果が得られるためテストが簡単 すべての依存関係が明示的に渡されるため、どのように動作するかを簡単に理解できる
すべての 副作用 は、関数自体で直接起こるのではなく、パラメータに カプセル化 されている これによりテストが簡単になり、どのような副作用が起こるのかを制御するのも簡単になる