haskell - 使用 id 参数为处理程序编写 Yesod 测试用例,其中 id 是实体的键

标签 haskell yesod

我一直在关注 yesod 教程,但我一直困惑于如何构建涉及 View 中参数的单元测试,该 View 也访问数据库。稍微回溯一下,我遵循了 Echo.hs 示例:

    getEchoR :: Text -> Handler Html
    getEchoR theText = do
        defaultLayout $ do
            $(widgetFile "echo")

相应的测试,注意我必须使用Data.Text.pack将参数转换为Text

    yit "Echo some text" $ do
        get $ EchoR $ pack "Hello"
        statusIs 200

现在我的模型定义如下:

Tag
    name Text
    type Text

使用可以渲染的处理程序,该处理程序显然将 TagId 作为参数

    getTagR :: TagId -> Handler Html
    getTagR tagId = do
        tag <- runDB $ get404 tagId
        defaultLayout $ do
            setTitle $ toHtml $ tagName tag
            $(widgetFile "tag")

这是测试失败的地方。

    yit "Get a tag" $ do
        -- tagId is undefined
        get $ TagR tagId
        statusIs 200

我不知道如何定义 tagId。它不适用于字符串、文本或数字,而且我似乎不知道如何生成字符串,因为我在各种 Data.Persist 教程中找不到任何示例代码。或者更好的是,通过其他方式调用 get 方法。

最佳答案

您想要使用Key数据构造函数来构造 ID 值,该值采用 PersistValue 作为参数。创建一个简单的示例是:

Key $ PersistInt64 5

另一种选择是使用文本 URL 调用 get,例如get("/tag/5"::Text)

关于haskell - 使用 id 参数为处理程序编写 Yesod 测试用例,其中 id 是实体的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22172573/

相关文章:

haskell - 使用具有 'limited' 约束的约束种类和类型族

Haskell:使用 MapReduce 搜索子字符串?

haskell - Haxl 中的代码重用 - 避免针对每个请求类型使用 GADT 构造函数

forms - 带有页面流的 Yesod 表单

haskell - 小村庄模板中的 $forall 问题

haskell - 缺少实例错误、模块加载和 GHCi

haskell:使用高阶函数的阶乘

haskell - Haskell 中有理数的模式匹配

haskell - shakespeare-js 无法在 Heroku 上编译

haskell - 尝试时链接错误 "stack install yesod-bin"