1

次のScottyエンドポイントを使用します。

myendpoint :: Text -> ScottyM ()
myendpoint info =
    post "/foo/bar/:var" $ do
        var :: Text <- param "var"
        query :: Query <- jsonData
        result <- liftIO $ retrieveResult info var query
        json $ result

runApi :: IO ()
runApi = scotty 4602 $ do
    myendpoint

myendpointたとえば、さまざまな可能な入力でテストする方法

info1 = "foo"
query1 = Query { qParam1 = "foo", qParam2 = "bar" }
var1 = "bar"
expect1 = Result { foo = "foo", bar = "bar" }

res1 = decode $ test_myendpoint info1 query1 var1
res1 `shouldBe` expect1

info2 = "baz"
query2 = Query { qParam1 = "hello", qParam2 = "there" }
var2 = "boo"
expect2 = Result { foo = "biz", bar = "dev" }

res2 = decode $ test_myendpoint info2 query2 var2
res2 `shouldBe` expect2

API を別のスレッドで単純に実行してから、JSON を使用して実際にエンドポイントをクエリしたくなるのですが、これを行うためのよりクリーンな方法はありますか? (ただし、上記の利点は実際のエンドツーエンドのテストになります)

4

1 に答える 1

2

答えを見つけました。と をインポートする必要がhspec-waiありhspec-wai-jsonます。

次に、API を直接実行する代わりに、apiを返す関数を作成してから、実際に実行するIO Application別の関数を作成します。runApi

import           Network.Wai                 (Application)
import           Network.Wai.Handler.Warp    (run)

api :: IO Application
api = scottyApp $ do
    myendpoint

runApi :: IO ()
runApi =
    api >>= run 460

with apiこれで、テストで自由に使用できるようになりました。

import           Test.Hspec
import           Test.Hspec.Wai      as W
import           Test.Hspec.Wai.JSON

spec :: Spec
spec = with api $ do
    describe "testing some endpoint" $ do
        it "should return correct data" $ do
            get "/foo/bar/whatever" `shouldRespondWith`
                [json|{foo: "foo", bar: "bar"}|]
于 2021-05-13T20:57:23.290 に答える