型クラスのさまざまなインスタンス (の実装) を (ブラック ボックスとして) チェックすることを目的とする、一般的な単体テスト コードを記述するための既知のパターンがあるかどうか疑問に思っていました。例えば:
import Test.HUnit
class M a where
foo :: a -> String
cons :: Int -> a -- some constructor
data A = A Int
data B = B Int
instance M A where
foo _ = "foo"
cons = A
instance M B where
foo _ = "bar" -- implementation error
cons = B
コードが適用される特定のインスタンスを指定する何らかの方法で をtests
返す関数を書きたいと思います。デフォルトの実装でクラスの定義に追加することを考えていましたが(テストコードと実際のコードの間の結合の問題は今のところ無視しています)、単純に持つことはできません。関数を呼び出すための指定された型の要素)、コードを参照する方法とコード内を理解することができません(型注釈のようなものはできません)。Test
tests
tests
tests :: Test
tests:: a -> Test
cons
foo
(cons 0) :: a
class (Eq a) => M a where ...
代わりに、型とA
派生をB
使用するEq
と、次のようなものでコンパイラをだますことができます(の定義に追加M
):
tests :: a -> Test
tests x = let
y = (cons 0)
z = (x == y) -- compiler now knows y :: a
in
TestCase (assertEqual "foo" (foo y) "foo")
main = do
runTestTT $ TestList
[ tests (A 0)
, tests (B 0)
]
しかし、これはすべて私にとって非常に醜いです。どんな提案でも大歓迎です