# 第6章 - まず単体テストが3種類ある点 - 意識していなかった - 名前を知らなかった - 出力値ベーステスト - 状態ベーステスト - コミュニケーションベーステスト - 今までは(おそらく)ドメイン層の単体テストで出力値ベーステスト、インフラ層の単体テストでは出力値+コミュニケーションベーステストをやっていたのかなと思う - 呼び出し回数を厳密に管理していたわけではないので違うかも - インフラ層ではモックを多用しがちではある - p185: 副作用をビジネス・オペレーションの最初や最後に持っていく - どうやって? - unix哲学的なところに通ずるものがあるかも メソッド・シグネチャ: e.g.) public decimal CalculateDiscount (Product[] products): p181 隠れた入力と出力の種類には、次のものがあります。: p183 - 副作用 ― 副作用とは、メソッド・シグネチャには表現されていない出力のことである。つまり、副作用は 隠れた出力 を意味する。副作用を起こす操作の例として、オブジェクトの状態を変更することやディスク上のファイルを更新することなどがある。 - 例外 ― メソッドが例外をスローすることはメソッド・シグネチャで確立された契約を無視したプログラムの流れが作られることを意味する。そして、このスローされた例外は何層にもなった呼び出しの中のどこかでキャッチされることになる。つまり、例外はメソッド・シグネチャには定義されていない 隠れた出力 を意味することになる。 - 内部もしくは外部の状態への参照 ― メソッドの中には、その内部でDateTime.Nowのような静的(static)なプロパティを介してその時点での日時を取得したり、データベースからデータを取得したり、プライベートな可変のフィールドを参照したりすることを行っているものがある。これらの情報の取得や参照はすべてメソッド・シグネチャには定義されていない入力である。つまり、このようなことをするメソッドには 隠れた入力が存在することになる。