测试Snap Web框架处理程序

时间:2012-01-11 03:57:45

标签: haskell types integration-testing haskell-snap-framework

我想为我的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?请帮助,这有点让我失望。

1 个答案:

答案 0 :(得分:1)

Ibolla的return create技巧可能不会做你想要的。它正确编译,因为runHandler采用Snap a,它将对具有任何返回值的Snap操作起作用。 return create :: Snap (AppHandler ()),与您可能期望的Snap ()非常不同。

我们正在开发一个Snap.Snaplet.Test等价物,它将包装Snap.Test提供的runHandler函数,以允许您测试处理程序。这可能会包含在snap包的0.10版本中。

在此期间,您可以使用runSnapletSnapletInit转换为可传递给Snap.Test.runHandler的Snap ()操作,从而手动解决问题。这不会让您测试个人Handler,但它可以让您测试应用程序初始化程序中定义的任何路由。

编辑:在snap-0.10中,我们添加了test support for snaplets