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