我是Haskell的新手,因此我無法吸收Yesod中使用的所有高級功能,例如type instances和equality constraints。我試圖在Yesod的測試框架中實現bracket pattern以獲得setUp/tearDown功能。這裏就是我這麼遠(通過編輯更新):Yesod /持久測試支架模式
module FishMother where
import Control.Exception.Lifted
import TestImport
import Database.Persist
import Database.Persist.GenericSql
import Model
insertYellowfinTuna :: OneSpec Connection FishId
insertYellowfinTuna = runDB . insert $ Fish "Yellowfin Tuna"
deleteFish :: FishId -> OneSpec Connection()
deleteFish = runDB . delete
withYellowfinTuna :: FishId -> OneSpec Connection()
withYellowfinTuna = bracket insertYellowfinTuna deleteFish
編譯錯誤如下:
tests/FishMother.hs:18:21:
Couldn't match type `FishId
-> Control.Monad.Trans.State.Lazy.StateT
(Yesod.Test.OneSpecData Connection) IO()'
with `Key SqlPersist Fish'
Expected type: FishId -> OneSpec Connection()
Actual type: (FishId
-> Control.Monad.Trans.State.Lazy.StateT
(Yesod.Test.OneSpecData Connection) IO())
-> Control.Monad.Trans.State.Lazy.StateT
(Yesod.Test.OneSpecData Connection) IO()
In the return type of a call of `bracket'
In the expression: bracket insertYellowfinTuna deleteFish
In an equation for `withYellowfinTuna':
withYellowfinTuna = bracket insertYellowfinTuna deleteFish
我在做什麼錯?
暫時忘掉Yesod吧。如果這只是普通的'IO',你可以使用函數'setup :: IO FishId','tearDown :: FishId - > IO()',然後'withYellowfinTuna =括號設置tearDown'。先了解該函數的類型,然後回到Yesod世界,嘗試用'OneSpec Connection'單元替換'IO'。 –
謝謝@ michael-snoyman。有時你只需退後一步,甚至可以睡一覺,以解決問題。通過'OneSpec Connection'和其他功能的類型,這也有助於我瞭解自己在正確的軌道上。這是我正在尋找的更正的類型簽名:'withYellowfinTuna ::(FishId - > OneSpec連接()) - > OneSpec連接()' – arussell84