2

型クラスのさまざまなインスタンス (の実装) を (ブラック ボックスとして) チェックすることを目的とする、一般的な単体テスト コードを記述するための既知のパターンがあるかどうか疑問に思っていました。例えば:

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返す関数を書きたいと思います。デフォルトの実装でクラスの定義に追加することを考えていましたが(テストコードと実際のコードの間の結合の問題は今のところ無視しています)、単純に持つことはできません。関数を呼び出すための指定された型の要素)、コードを参照する方法とコード内を理解することができません(型注釈のようなものはできません)。Testteststeststests :: Testtests:: a -> Testconsfoo(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)
   ]

しかし、これはすべて私にとって非常に醜いです。どんな提案でも大歓迎です

4

1 に答える 1