Test Snap Web Framework Handler - PullRequest
       27

Test Snap Web Framework Handler

2 голосов
/ 11 января 2012

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

1 Ответ

1 голос
/ 16 октября 2012

Трюк Иболлы return create, вероятно, не делает то, что вы хотите. Он компилируется правильно, потому что runHandler принимает Snap a, который будет работать с действием Snap с любым возвращаемым значением. return create :: Snap (AppHandler ()), что сильно отличается от Snap (), который вы, вероятно, ожидали.

Мы работаем над эквивалентом Snap.Snaplet.Test, который обернет функцию runHandler, предоставляемую Snap.Test, чтобы позволить вам тестировать обработчики. Это, вероятно, будет включено в выпуск 0.10 пакета snap.

Тем временем вы можете решить проблему вручную, используя runSnaplet , чтобы преобразовать SnapletInit в действие Snap (), которое можно передать Snap.Test.runHandler. Это не позволит вам протестировать отдельный Handler, но позволит вам протестировать любой из маршрутов, определенных в инициализаторе вашего приложения.

EDIT: в snap-0.10 мы добавили тестовую поддержку для snaplets .

...