前提・実現したいこと
標準出力、標準入力のテストをしたい
実際にはこの問題
のテストを作りたいです。
IOテストの現在の標準みたいなのがあればそれがしりたいです。
試したこと
1.Haskellで副作用をモックしてテストを書くを参考に書いてみたけど動かず
2.Haskell で書いた Web サービスにおける IO 部分の自動テストをもとに実装をしようと思ったが理解できず実装できなかった。
補足情報(FW/ツールのバージョンなど)
windows10
$stack --version
Version 2.5.1, Git revision d6ab861544918185236cf826cb2028abb266d6d5 x86_64 hpack-0.33.0
stack.yaml
yaml
1resolver: 2 url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/17/10.yaml
サンプルコード(コンパイルエラー)
haskell
1{-# LANGUAGE GeneralizedNewtypeDeriving #-} 2import Control.Monad 3import Control.Monad.Writer 4import Control.Monad.Reader 5import Control.Monad.Identity 6import System.IO 7 8prettyPrint :: (Monad m, MonadStdout m) => String -> m () 9prettyPrint ss= print ss 10 11class MonadStdout m where 12 putStrLnM:: String -> m () 13 14instance MonadStdout IO where 15 putStrLnM = putStrLn 16 17data Settings = Settings -- whatever you like 18newtype MockT m a = MockT (WriterT String (ReaderT Settings m) a) 19 deriving (Functor, Applicative, Monad) 20 21runMockT :: MockT m a -> Settings -> m (a, String) 22runMockT (MockT w) = runReaderT $ runWriterT w 23 24runMock :: MockT Identity a -> Settings -> (a, String) 25runMock = fmap runIdentity . runMockT 26 27instance MonadTrans MockT where 28 lift = MockT . lift . lift 29 30instance Monad m => MonadStdout (MockT m) where 31 putStrLnM s = MockT $ tell $ s <> "\n" 32 33spec :: Monad m => m ((), String) 34spec = flip runMockT Settings $ 35 prettyPrint "something1" 36 37main = spec 38
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/16 04:59
2021/05/16 09:38