Haskell 用Hspec测试用户输入

Haskell 用Hspec测试用户输入,haskell,testing,hspec,Haskell,Testing,Hspec,我有一个程序,它从getLine获取用户输入,然后验证它是否都是数字。如果通过,则运行函数String->String,并将结果打印到屏幕上。如果没有,它将重复getLine module Main where import Control.Monad.Loops (untilJust) import Data.Char (isDigit) main = do let validateInput s = if all isDigit s then Just s els

我有一个程序,它从
getLine
获取用户输入,然后验证它是否都是数字。如果通过,则运行函数
String->String
,并将结果打印到屏幕上。如果没有,它将重复
getLine

module Main where

import Control.Monad.Loops (untilJust)
import Data.Char           (isDigit)

main = do
  let validateInput s = if all isDigit s then Just s else Nothing
  putStrLn =<< myFunc <$> untilJust (validateInput <$> (putStr "Number : " >> getLine))

myFunc = id -- to do

因为您想测试逻辑而不是用户交互,所以我建议您只需考虑输入验证。

嗯,我想我需要的不仅仅是逻辑。我基本上想从终点测试它,也就是说,我想根据一组可能的输入测试我的整个程序的功能。我确实会测试
myFunc
和测试
validateInput
。。。但是我想测试所有的东西作为一个整体。。。如果可能的话。我是根据您提供的输出示例回答的。我不确定是否可以使用HSpec轻松测试IO,但如果您想测试“管道”,我想您可以使用不同的monad来模拟IO、输入数据和记录输出。也许是国家单子。@matthias似乎建议采用类似的方法。@matthias完全回答了你的问题吗?对不起,我一整天都没在电脑前。我认为你的问题回答得足够多,为我指明了正确的方向。谢谢
test1 rejects a non-numeric input of "abc"
test2 returns 123 as 123