[英]Unit testing IO actions with Hspec
在類似的情況下,我發現了其他問題,但是在這種特定情況下,沒有任何問題可以回答我的問題。 此外,似乎幾乎沒有資源可以簡單地涵蓋Haskell中的單元測試IO操作的主題。
假設我的數據庫通信具有此類型類:
data Something = Something String deriving Show
class MonadIO m => MonadDB m where
getSomething :: String -> m Something
getSomething s = do
... -- assume a DB call is made and an otherwise valid function
instance MonadDB IO
和使用它的函數:
getIt :: MonadDB m => m (Int, Something)
getIt = do
s@(Something str) <- getSomething "hi"
return (length str, s) -- excuse the contrived example
我希望使用hspec測試此getIt
函數,但不與數據庫進行通信,這大概意味着要替換它使用的MonadDB
,但是我如何實現呢?
這對您有用嗎?
#!/usr/bin/env stack
-- stack exec --package transformers --package hspec -- ghci
import Control.Monad.IO.Class
import Control.Monad.Trans.Identity
import Data.Char
import Test.Hspec
data Something = Something String deriving (Eq, Show)
class MonadIO m => MonadDB m where
getSomething :: String -> m Something
getSomething s = return $ Something (map toUpper s)
instance MonadDB IO
instance MonadIO m => MonadDB (IdentityT m)
getIt :: MonadDB m => m (Int, Something)
getIt = do
s@(Something str) <- getSomething "hi"
return (length str, s)
main :: IO ()
main = hspec $ do
describe "Some tests" $ do
it "test getIt" $ do
runIdentityT getIt `shouldReturn` (2, Something "HI")
it "test getIt should fail" $ do
runIdentityT getIt `shouldReturn` (1, Something "HI")
您也許還可以使用ReaderT
或StateT
為測試查詢“提供”數據或getSomething
的轉換。
編輯:在hspec中使用示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.