Я хочу написать небольшие интеграционные тесты для моих веб-обработчиков Snap, но я застрял. Вот сценарий. У меня есть веб-обработчик Snap, который (заурядный стиль) 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
? Помогите пожалуйста, это как бы сбивает меня с толку.