2

Snap Webハンドラーの統合テストを少し書きたいのですが、行き詰まります。これがシナリオです。私は、(ありふれたスタイルの)型をCRUDするSnap Webハンドラーを持っており、次のようになります。

create :: AppHandler ()
create = method POST $ do
         lastName  <- decodeUtf8 . fromJust <$> getParam "lastName"
         firstName <- decodeUtf8 . fromJust <$> getParam "firstName"
         createPerson $ Person firstName lastName
         modifyResponse (setResponseCode 204)

モジュールにはリクエストの作成に役立つものがいくつかあり、Snap.Testそれを使用してハンドラーのリクエストを作成します。

createOwnerReq :: RequestBuilder IO () 
createOwnerReq = postUrlEncoded "host/person/create" $
                 fromList [ ("firstName", ["Greg-Shaw"])
                          , ("lastName",  ["Snoy'Sullivan"])
                          ]

ここに問題があります。このハンドラーのTestUnitTestCaseを作成したいので、createOwnerReqリクエストでハンドラーを実行する必要があります。モジュールSnap.Testは以下を提供します:

 runHandler :: MonadIO a => RequestBuilder m () -> Snap a -> m Response

それで

 ... do 
     resp <- runHandler createOwnerReq ??? 

ちょっと待って!!!私のリクエストハンドラーはタイプですが、タイプのハンドラーAppHandler ()runHandler必要Snap aです。AppHandlerタイプをSnapモナドに持ち上げるにはどうすればよいですか?助けてください、これは一種のトリッピンです。

4

1 に答える 1

1

Ibolla のreturn createトリックは、おそらくあなたが望んでいることにはなりません。runHandler は、Snap a任意の戻り値を持つ Snap アクションで機能する を受け取るため、正しくコンパイルされます。 、おそらくあなたが期待していたreturn create :: Snap (AppHandler ())ものとは大きく異なります。Snap ()

私たちは、Snap.Test によって提供される runHandler 関数をラップして、Handler をテストできるようにする Snap.Snaplet.Test に相当するものに取り組んでいます。これはおそらく snap パッケージの 0.10 リリースに含まれるでしょう。

とりあえず、 runSnapletを使用して、Snap.Test.runHandlerに渡すことができるアクションに変換するSnapletInitことで、問題を手動で解決できます。Snap ()これにより、個々の をテストすることHandlerはできませんが、アプリケーションの初期化子で定義されたルートのいずれかをテストできます。

編集: snap-0.10 では、スナップレットのテスト サポートを追加しました。

于 2012-10-16T16:09:41.947 に答える