2012-03-11 52 views

回答

10

那么,如果不是IO,而是使用了一个模拟I/O的monad,并且具有完美的控制和规定的环境呢?你可以很容易地测试那些“IO”操作,就像它们是纯函数一样。这背后例如IOSpec,它允许您精确地指定你想要什么样的效果,让你的模拟IO去更远的想法,你可以写:

myFunction :: a -> b -> IOSpec (Teletype :+: IORefS) 
myFunction x y = do 
    ... 
    putStr (...) 
    ref <- newIORef ... 
    ... 

(电传允许终端的功能, IORefS作为参考) 然后在一个quickcheck属性中测试你的函数(参见VM模块和runIOSpec),完全控制输入和输出,甚至在GHCI中一步一步地进行测试。如果工作正常,只需更改导入以引入Test.IOSpec.Surrogate,它将IOSpec f重新定义为IO的同义词。