【发布时间】:2019-12-22 15:57:41
【问题描述】:
更新:我注意到我的代码设计存在问题。我的代码的整体结构发生了很大变化,以至于对这个问题的任何回答都或多或少与其当前状态无关。但是 SO 说最好不要删除已回答的问题,所以我保留了这个问题。
我的代码的问题是类型类对于我想做的事情来说太通用了。现在我专注于编写像
这样的函数makeModelId :: String -> Either StringValueError ModelId
然后用类似的东西扩展它:
makeModelIdM :: (Monad m) => String -> m (Either StringValueError ModelId)
makeModelIdM astr = do
idstr <- astr
return (makeModelId idstr)
我不确定这是否是最好的方法..
我知道有很多类似的问题,比如this 或this 或this,据我所知,我想用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 函数,并且我认为我的错误处理方法存在问题。任何提示将不胜感激。
【问题讨论】:
标签: unit-testing haskell error-handling monads