我跟随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中实现测试的示例。
答案 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是如何工作的,以及我在第一次尝试时做错了什么。我很乐意给出一个有用的正确答案。