【问题标题】:test haskell io for custom data type测试自定义数据类型的haskell io
【发布时间】: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)

我不确定这是否是最好的方法..


我知道有很多类似的问题,比如thisthisthis,据我所知,我想用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


    【解决方案1】:

    (这更像是一个评论,但也可能是一个答案。)

    您确定需要第二类课程吗? 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 也是如此。

    【讨论】:

    • 我想是的,因为我还有 2 种其他数据类型,它们是根据重叠条件从字符串中读取的。我正在使用makeModelIdM :: (Monad m) =&gt; String -&gt; m ModelId 等功能控制他们的生产。我不确定这是否是最好的方法。我应该尝试测试makeModelId 吗?
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2012-03-12
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多