2

我想为我的 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 ??? 

可是等等!!!我的请求处理程序是 typeAppHandler ()runHandler需要一个 Handler 类型Snap a。如何将我的AppHandler类型提升到Snapmonad?请帮忙,这有点让我失望。

4

1 回答 1

1

Ibolla 的return create伎俩可能不会如你所愿。它可以正确编译,因为 runHandler 采用了一个Snap a可以处理任何返回值的 Snap 操作。 ,这与您可能期望return create :: Snap (AppHandler ())的非常不同。Snap ()

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

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

编辑:在 snap-0.10 中,我们添加了对 snaplets 的测试支持

于 2012-10-16T16:09:41.947 回答