Unit testing IO actions with Hspec

隐身守侯 提交于 2019-12-01 11:25:36

Would this work for you?

#!/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")

You might also be able to use ReaderT or StateT to "supply" data or a transformation for getSomething to use upon test querying.

Edit: Example use from within hspec.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!