1

ルートの単体テスト中に問題が発生しました。Scotty、Persistent、および Hspec-WAI。

Yesod や Spock とは異なり、Scotty にはデータベース ハンドラを格納する適切な場所がありません。データベースを起動し、データベース プールをローカル変数として保持し、その変数を使用する 1 つの大規模な "do" を用意することで、機能するようになりました。

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

しかし、Hspec-WAI は IO 申請フォームでそれを望んでいます。

scottyApp :: ScottyM () -> IO Application

DB 接続プールを 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 に答える