2012-01-11 1 views
2

Я хочу написать небольшие интеграционные тесты для моих обработчиков Snap, но я застрял. Вот сценарий. У меня есть веб-обработчик оснастки, что (заурядный стиль) CRUDs до типа и это выглядит примерно так:Проверка привязки Web Framework Handler

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? Помогите, пожалуйста, это отвлекает меня.

+0

Является ли 'AppHandler' типом, который вы определили? Я посмотрел в Интернете, но не видел его нигде. –

+0

'type AppHandler = приложение приложения Handler App ... ... его синоним, который показан в учебнике snap на веб-сайте Snap. Тип 'Handler b v' является экземпляром' MonadSnap'. – ExternalReality

+0

Я подумал, что это что-то в этом роде. Спасибо, что разобрался. –

ответ

1

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

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

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

EDIT: В оснастке-0.10 мы добавили test support for snaplets.