[英]test haskell io for custom data type
更新:我注意到我的代碼設計存在問題。 我的代碼的整體結構發生了很大變化,以至於對這個問題的任何答案都或多或少與其當前狀態無關。 但是 SO 說最好不要刪除已回答的問題,所以我保留了這個問題。
我的代碼的問題是類型類對於我想做的事情來說太通用了。 現在我專注於編寫函數,例如
makeModelId :: String -> Either StringValueError ModelId
然后用類似的東西擴展它:
makeModelIdM :: (Monad m) => String -> m (Either StringValueError ModelId)
makeModelIdM astr = do
idstr <- astr
return (makeModelId idstr)
我不確定這是否是最好的方法。
我知道有很多類似的問題,比如 這個或這個或這個,據我所知,我想要做的事情可以用HUnit
來實現。 但我似乎無法找到這樣做的確切方法。
我基本上有一個 setter 類型類,它是
class StringLike2Primitive model where
fromString :: String -> model
fromText :: Text -> model
fromText aText = fromString (unpack aText)
class (StringLike2Primitive model) => StringLike2PrimitiveM model where
fromStringM :: (MonadPlus m) => String -> m model
fromTextM :: (MonadPlus m) => Text -> m model
fromStringM astr = return (fromString astr)
fromTextM aText = fromStringM (unpack aText)
我有幾個數據類型實現了這些類型類,例如:
instance StringLike2Primitive ModelId where
fromString = StringIdCons
instance StringLike2PrimitiveM ModelId where
fromStringM aStr
| null aStr = fail "empty string is not allowed as id"
| not (isAlphaNumStr aStr) = fail
"Only ascii alphanumeric strings are allowed"
| not (isAsciiStr aStr) = fail
"Only ascii alphanumeric strings are allowed"
我不確定如何在單元測試環境中針對受保護的值測試fromStringM
函數,而且我認為我的錯誤處理方法有問題。 任何提示將不勝感激。
(這更像是一個評論,但也可能是一個答案。)
你確定你需要第二類嗎? fromStringM
的定義並不依賴StringLike2Primitive
實例,它只是簡單地包裝了它。
fromStringM :: (Monad m, StringLike2Primitive a) => String -> m a
fromStringM a
| null a = fail "empty string is not allowed"
| not (isAlphaNumStr aStr) = fail "Only ascii alphanumeric strings are allowed"
| not (isAsciiStr aStr) = fail "Only ascii strings are allowed"
| otherwise = return $ fromString a
對於fromText
也是fromText
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.