我想为我的Snap web处理程序编写很少的集成测试,但是我被卡住了。这是场景。我有一个Snap Web处理程序(普通的样式)CRUDs类型,它看起来像这样:
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?请帮助,这有点让我失望。
答案 0 :(得分:1)
Ibolla的return create
技巧可能不会做你想要的。它正确编译,因为runHandler采用Snap a
,它将对具有任何返回值的Snap操作起作用。 return create :: Snap (AppHandler ())
,与您可能期望的Snap ()
非常不同。
我们正在开发一个Snap.Snaplet.Test等价物,它将包装Snap.Test提供的runHandler函数,以允许您测试处理程序。这可能会包含在snap包的0.10版本中。
在此期间,您可以使用runSnaplet将SnapletInit
转换为可传递给Snap.Test.runHandler的Snap ()
操作,从而手动解决问题。这不会让您测试个人Handler
,但它可以让您测试应用程序初始化程序中定义的任何路由。
编辑:在snap-0.10中,我们添加了test support for snaplets。