理想的には、関数をリファクタリングします
unify' :: [Constraint] -> Maybe [Substitution]
unify' = -- your original function, but return Nothing instead of calling error,
-- and return Just x when your original function would return x
unify = fromMaybe (error "Circular constraint") . unify'
次に、テストunify'
の代わりにテストしますunify
。
考えられるエラー メッセージが複数ある場合は、代わりに次のようにリファクタリングします。
unify' :: [Constraint] -> Either String [Substitution]
-- and return Left foo instead of calling error foo
unify = either error id . unify'
unify'
(ちなみに、これが他のプログラマーが使用するライブラリ用である場合、一部のプログラマーは部分関数の代わりに呼び出すことを好むでしょうunify
。)
コードをリファクタリングできない場合は、リンク先のコードを次のように変更しますassertException
。
assertErrorCall :: String -> IO a -> IO ()
assertErrorCall desiredErrorMessage action
= handleJust isWanted (const $ return ()) $ do
action
assertFailure $ "Expected exception: " ++ desiredErrorMessage
where isWanted (ErrorCall actualErrorMessage)
= guard $ actualErrorMessage == desiredErrorMessage