2016-04-10 3 views
3

Я новичок в Yesod, и я пытаюсь добавить ожидающий spec в блок withApp (на данный момент я просто пытаюсь изменить спецификацию, созданную с помощью Yesod scaffholding) ,Как делать ожидающие спецификации в спецификациях Yesod

код выглядит следующим образом:

appSpec :: Spec appSpec :: withApp $ делать описывают "getMyHandlerR" $ сделать это "TODO" $ делать в ожидании

Но я получил следующее сообщение об ошибке сообщение:

Couldn't match type ‘(App, wai-3.2.0:Network.Wai.Middleware)’ 
       with ‘()’ 
Expected type: SpecWith (TestApp App) 
    Actual type: SpecWith (Arg Expectation) 
In a stmt of a 'do' block: it "todo" $ do { pending } 
In the second argument of ‘($)’, namely 
    ‘do { it "todo" $ do { pending } }’ 
In a stmt of a 'do' block: 
    describe "upload a file without error" 
    $ do { it "todo" $ do { pending } } 

Если я удалю withApp, все будет работать. Я понимаю, что withApp меняет как-то ожидаемый тип, но почему describe и it имеют правильный тип, тогда как pending нет?

+1

Я думаю, вам просто нужно выбросить 'TestApp App' аргумент через' его $ \ _ «Todo» -> pending' или ' это «todo» $ const pending' –

+1

Я могу подтвердить работу исправления MichaelSnoyman – MaxGabriel

+0

Вау, это действительно работает. Я пробовал 'liftIO', но безуспешно. Я все еще удивляюсь, что 'it '" pending' работает вне 'withApp', но не внутри, там, вероятно, есть какая-то магия вывода. @MichaelSnoyman вы могли бы разместить сообщение, чтобы я мог принять его? Разве это не стоило бы добавлять «ypending» или эквивалент? – mb14

ответ

3

Копирование мой комментарий к ответу:

Я думаю, вам просто нужно выбросить TestApp App аргумент через:

it "todo" $ \_ -> pending 

или

it "todo" $ const pending 

Не было бы стоит ли добавить ypending или эквивалент?

Звучит как хорошая идея для меня, я на самом деле никогда не использовал pending, поэтому я и не думал об этом. Сможете ли вы отправить PR, чтобы включить его?

+0

Я рад сделать запрос на растяжение. Однако, должно ли оно быть ypending как yit? Я до сих пор не понимаю, почему нормальный ожидающий dosenst работает в нормальном блоке (а не в блоке yit) – mb14

+0

Поскольку тип 'pending' является' Expectation', который является 'IO()', не позволяя использовать дополнительный аргумент. Я не совсем понимаю тип магии в hspec, но он присутствует. –

+0

У меня был взгляд, и это было более сложно, чем я думал. выполнение 'ypending = const pending' не работает в контексте' yit', который в любом случае я не использую. Я понимаю, что «yit» делает что-либо в данный момент. В Hspec есть семейства типов, что объясняет магию. Возможно, можно изменить 'withApp' с лесов, чтобы принять ожидающий без const. – mb14

1

Это работает как шарм для меня с последней Йесод:

it "should x" $ do 
    liftIO pending 
Смежные вопросы