在yesod-test响应中获取“具有id内容的多个输入”

时间:2014-07-23 02:59:57

标签: yesod yesod-forms

我跟随Esposito's Yesod tutorial并尝试围绕镜像示例进行测试。

我的测试来自HomeTest.hs所包含的yesod init文件:

{-# LANGUAGE OverloadedStrings #-}
module MirrorTest
    ( mirrorSpecs
    ) where

import TestImport
import qualified Data.List as L

mirrorSpecs :: Spec
mirrorSpecs =
    ydescribe "This tests the sample mirror feature" $ do

        yit "loads the mirror page and checks it has correct elements" $ do
            get MirrorR
            statusIs 200
            htmlAllContain "h1" "Mirror test"
            htmlAllContain "label" "Enter your text"

            request $ do
                setMethod "POST"
                setUrl MirrorR
                byLabel "Enter your text" "wooo"

            statusIs 200
            printBody
            htmlCount ".p" 1
            htmlAllContain ".h1" "You posted"
            htmlAllContain ".p" "woooooow"
            htmlAllContain ".p" "text/plain"

同时我的mirror.hamlet文件是:

<h1> Mirror test
<form method=post action=@{MirrorR}>
    <label for=content>Enter your text
    <input type=text name=content>
    <input type=submit>

但我得到的测试结果是:

1) This tests the sample mirror feature loads the mirror page and checks it has correct elements
More than one input with id content

我很困惑:只有一个输入具有内容的名称,而多个元素具有该名称,但据我所知,名称不一定是唯一的(与实际不同) IDS )。我是否需要使用Yesod.Test.TransversingCSS来完成我想要做的事情,给输入一个实际的id?

我的Haskell仍然非常弱,所以我可能会错过这些显而易见的内容,并且非常感谢如何在Yesod中实现测试的示例。

2 个答案:

答案 0 :(得分:1)

我没有收到与您相同的错误消息。相反,我看到的错误消息是:

  

没有id内容的输入

这可能是因为yesod-form版本不同。此错误消息完全准确,并指示实际错误。标签的for属性是指代码id,而不是name。请尝试将id上的input属性设置为content,看看是否能解决您的问题。

答案 1 :(得分:0)

目前,我的解决方案是忽略尝试实际使用第一个GET请求中的表单(因为我会用它来处理它,比如Capybara),而我只是直接将params分流到提交我的表单的POST。这就是通过:

{-# LANGUAGE OverloadedStrings #-}
module MirrorTest
    ( mirrorSpecs
    ) where

import TestImport
import qualified Data.List as L

mirrorSpecs :: Spec
mirrorSpecs =
    ydescribe "This tests the sample mirror feature" $ do

        yit "loads the mirror page and checks it has correct elements" $ do
            get MirrorR
            statusIs 200
            htmlAllContain "h1" "Mirror test"
            htmlAllContain "label" "Enter your text"

            request $ do
                setMethod "POST"
                setUrl MirrorR
                addPostParam "content" "wooo"

            statusIs 200
            printBody
            htmlCount "p" 2
            htmlAnyContain "h1" "You posted"
            htmlAnyContain "p" "woooooow"

我仍然非常想了解byLabel是如何工作的,以及我在第一次尝试时做错了什么。我很乐意给出一个有用的正确答案。