1

尝试对路线进行单元测试时出现问题。Scotty、Persistent 和 Hspec-WAI。

与 Yesod 或 Spock 不同,Scotty 没有存储数据库处理程序的好地方。我通过一个大规模的“做”来启动数据库,将数据库池保持为局部变量,然后使用该变量来实现它。

app :: IO ()
app = do
    -- allocate_database  $ \pool
      -- scotty 8080 $do 
      --     handleSomeRoute pool

但是,Hspec-WAI 希望它在 IO 申请表中。

scottyApp :: ScottyM () -> IO Application

有没有一种理智的方法可以将数据库连接池注入 scottyApp ?

4

1 回答 1

4

这是你如何做到的。基本上,您在hspec拨打电话之前打开数据库:

{-# LANGUAGE OverloadedStrings #-}

import           Test.Hspec
import           Test.Hspec.Wai
import           Network.Wai (Application)
import qualified Web.Scotty as S

allocate_db :: (Int -> IO a) -> IO a
allocate_db = undefined

handleSomeRoute :: Int -> S.ScottyM ()
handleSomeRoute = undefined

main2 :: IO ()
main2 = allocate_db $ \pool -> do
  let app' = handleSomeRoute pool
  hspec $ with (S.scottyApp app') $ do
            describe "GET /" $ do
              it "responds with 200" $ do
                get "/" `shouldRespondWith` 200
于 2016-05-14T17:04:11.207 回答