[英]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.