检查每个URL是否可以在Yesod网站上的测试中使用

时间:2018-07-05 06:15:19

标签: unit-testing haskell yesod hspec

我试图检查所有链接在Yesod网站主页上是否正常工作。我写了这个hSpec测试。

asprintf

一切都可以编译,但是UserRegistrationModel res = response.body(); 函数摆脱了您提供它的URL的主机部分。例如,当您给它module Handler.HomeSpec (spec) where import Data.Either (fromRight) import qualified Data.Text as T import Network.Wai.Test (simpleBody) import TestImport import Yesod.Test.TransversingCSS (findAttributeBySelector) getAllLinks :: YesodExample site [Text] getAllLinks = withResponse $ \res -> do let links = fromRight [] findAttributeBySelector (simpleBody res) "a" "href" return $ T.concat <$> links spec :: Spec spec = withApp $ describe "Homepage" $ do it "checks all links" $ do get HomeR statusIs 200 links <- getAllLinks forM_ links $ \oneLink -> do get HomeR statusIs 200 get oneLink statusIs 200 时,它将尝试获取get并返回404代码。

有没有办法让它像我想要的那样工作?

我应该添加一个从测试中删除外部链接的功能吗?

难道不是正确的选择吗?

1 个答案:

答案 0 :(得分:0)

越简单越好:我从要检查的链接中删除了所有以协议开头的内容。感谢@ncaq的评论。

module Handler.HomeSpec (spec) where

import           Data.Either                (fromRight)
import qualified Data.Text                  as T
import           Network.Wai.Test           (simpleBody)
import           TestImport
import           Yesod.Test.TransversingCSS (findAttributeBySelector)

isRelative :: Text -> Bool
isRelative url
    | T.take 7 url == "http://"  = False
    | T.take 8 url == "https://" = False
    | T.take 7 url == "mailto:"  = False
    | T.take 4 url == "tel:"     = False
    | otherwise                  = True

getAllLinks :: YesodExample site [Text]
getAllLinks = withResponse $ \res -> do
    let currentHtml = simpleBody res
        links = fromRight [] $ findAttributeBySelector currentHtml "a" "href"
    return $ filter isRelative $ T.concat <$> links

spec :: Spec
spec = withApp $
    describe "Homepage" $ do
        it "checks all links" $ do
            get HomeR
            statusIs 200
            links <- getAllLinks

            forM_ links $ \oneLink -> do
                get HomeR
                statusIs 200
                get oneLink
                statusIs 200