簡體   English   中英

測試快照Web框架處理程序

[英]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版本中。

在此期間,您可以通過使用runSnapletSnapletInit轉換為可傳遞給Snap.Test.runHandler的Snap ()操作來手動解決問題。 這不會讓您測試單個Handler ,但是會讓您測試應用程序的初始化程序中定義的任何路由。

編輯:在snap-0.10中,我們添加了對snaplets的測試支持

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM