首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Hakyll的MonadMetadata进行测试

用Hakyll的MonadMetadata进行测试
EN

Stack Overflow用户
提问于 2018-11-01 17:23:44
回答 1查看 100关注 0票数 0

对于Hakyll代码库,我编写了一些助手方法,并开始围绕新的方法添加一些HSpec单元测试,例如:

代码语言:javascript
复制
-- | Reject an item unless @fieldName@ is set to "true"
unlessEnabled :: MonadMetadata m
              => String
              -> Item a
              -> m Bool
unlessEnabled fieldName item = do
    maybeValue <- getMetadataBool (itemIdentifier item) fieldName
    return $ maybe True not maybeValue

-- | Try to look up a boolean field ("true" maps to @Just True@)
getMetadataBool :: MonadMetadata m
                => Identifier
                -> String
                -> m (Maybe Bool)
getMetadataBool ident name = do
    maybeString <- getMetadataField ident name
    return $ ((== "true") . map toLower) <$> maybeString

现在,为测试创建一个ItemIdentifier是相当容易的,但我不知道在运行Hspec时,MonadMetadata在哪里。

我见过testCompiler,感觉它可能是可复制的/有用的( instance),但我已经超出了我的Haskell深度.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-04 18:10:42

最后(多亏了@Bergi的建议),我得到了一些有用的东西,然后整理了一下:

代码语言:javascript
复制
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

type KeyedValuesOf a = [(String, a)]

-- | Create Metadata from basic list of key-values -- stolen from Hakyll itself.
meta :: Yaml.ToJSON a => KeyedValuesOf a -> Metadata
meta pairs = HMS.fromList [(T.pack k, Yaml.toJSON v) | (k, v) <- pairs]

-- | A 'Reader' class of our own, with a specialised environment
--   for key-value metadata pairs.
newtype MonadMetadataReader a =
    MonadMetadataReader {runMonadMetadataReader :: KeyedValuesOf String -> a}
        deriving (Functor, Applicative, Monad)

-- | Simple 'Metadata' holder.
-- There are never any matches found,
-- and all metadata (for all items)
-- comes from from the Reader-like environment at setup.
instance MonadMetadata MonadMetadataReader where
    getMetadata identifier = MonadMetadataReader meta

    getMatches pattern = return []

它允许进行以下简单的单元测试:

代码语言:javascript
复制
it "enables for a value of \"false\"" $ do
    let enabled = runMonadMetadataReader (unlessEnabled "key" item) [("key", "false")]
    enabled `shouldBe` True

it "disables for a value of \"true\"" $ do
    let enabled = runMonadMetadataReader (unlessEnabled "key" item) [("key", "true")]
    enabled `shouldBe` False

it "enables if no metadata found" $ do
    let enabled = runMonadMetadataReader (unlessEnabled "key" item) []
    enabled `shouldBe` True
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53106288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档