繁体   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