「私はOOP言語のようにもっとTDDを考えています.Haskellでそのようなことは可能ですか?」
より良い質問は、「Haskell でそのようなことは必要ですか?」です。;-)
[それはあなたが実際に尋ねた質問ではないことに気づきました。この回答は無視してかまいません。]
OO 言語では、他のオブジェクトと対話して仕事を遂行するオブジェクトを構築します。そのようなオブジェクトをテストするために、偽のオブジェクトの束を構築し、実際のオブジェクトを偽のオブジェクトに接続し、テストしたいメソッドを実行し、予想される入力で偽のメソッドを呼び出すことをアサートします。
Haskell では、関数を記述します。純粋な関数が行う唯一のことは、何らかの入力を受け取り、何らかの出力を生成することです。したがって、それをテストする方法は、単に実行し、既知の入力を与えて、既知の出力を返すことを確認することです。それを行う過程で他のどの関数を呼び出すかは問題ではありません。私たちが気にするのは、答えが正しいかどうかだけです。
特に、OOP で通常これを行わない理由は、何らかの任意のメソッドを呼び出すと、ディスク ファイルの読み取りまたは書き込み、ネットワーク接続の開始、データベースや他のサーバーとの通信などの「実際の作業」が発生する可能性があるためです。コードの一部をテストしているだけで、どこかの実際のネットワーク サーバーでデータベースが実行されているかどうかにテストを依存させたくありません。コードのほんの一部をテストしたいだけです。
Haskell を使用すると、実世界に影響を与える可能性のあるものを、データ変換だけを行うものから分離できます。メモリ内のデータを変換するだけのものをテストするのは、とても簡単です! (実世界と相互作用するコードの部分をテストすることは、一般的にはまだ難しいです。しかし、うまくいけば、それらの部分は現在非常に小さいものです。)
選択された Haskell テスト スタイルは、プロパティ ベースのテストのようです。たとえば、方程式を解く関数がある場合、100 個の方程式をランダムに生成する QuickCheck プロパティを記述し、それぞれについて、返された数が実際に元の方程式を解くかどうかをチェックします。これはほんの一握りのコードで、知りたいことのほぼすべてを自動的にテストします。(ただし、完全ではありません。「ランダムに」選択された方程式が、関心のあるすべてのコード パスを実際にテストすることを確認する必要があります。)