[英]Test Snap Web Framework Handler
我想為Snap Web處理程序編寫一些集成測試,但遇到困難。 這是場景。 我有一個Snap Web處理程序,它(普通的樣式)可以CRUD起來一個類型,它看起來像這樣:
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"])
]
這是問題所在,我想為此處理程序創建一個TestUnit TestCase,因此我需要在createOwnerReq
請求上運行該處理程序。 Snap.Test
模塊提供:
runHandler :: MonadIO a => RequestBuilder m () -> Snap a -> m Response
所以
... do
resp <- runHandler createOwnerReq ???
可是等等!!! 我的請求處理程序是AppHandler ()
類型,但runHandler
需要一個Snap a
類型的處理程序。 如何將我的AppHandler
類型提升到Snap
monad中? 請幫助,這是我的絆腳石。
Ibolla的return create
技巧可能無法滿足您的要求。 它可以正確編譯,因為runHandler會使用Snap a
,它將對具有任何返回值的Snap操作起作用。 return create :: Snap (AppHandler ())
,這與您可能期望的Snap ()
非常不同。
我們正在開發等效的Snap.Snaplet.Test,它將包裝Snap.Test提供的runHandler函數以允許您測試Handlers。 這可能會包含在snap軟件包的0.10版本中。
在此期間,您可以通過使用runSnaplet將SnapletInit
轉換為可傳遞給Snap.Test.runHandler的Snap ()
操作來手動解決問題。 這不會讓您測試單個Handler
,但是會讓您測試應用程序的初始化程序中定義的任何路由。
編輯:在snap-0.10中,我們添加了對snaplets的測試支持 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.