使用文件相关测试进行HUnit测试

时间:2013-05-08 17:48:43

标签: haskell io monads hunit

我有一个词法分析器,并希望针对一组已知良好的测试用例进行测试。它们保存在子目录 ./ test_src / 中,每个目录都有一个扩展名 testname .txt

我想做的是获取所有相关测试用例的路径:

getTestFiles :: IO [FilePath]
find always (extension ==? ".txt") "/path/to/test_src/"

创建一个包含HUnit TestCases的HUnit TestList,每个包含一个通过

行的函数创建的断言
testMyLexer :: IO FilePath -> Assertion

的内容
myTest :: [IO FilePath] -> Test
myTest = TestList $ fmap TestCase $ fmap testMyLexer 

我的方法似乎是失败的,这似乎首先需要以下函数,然后映射其结果:

unableToDoThis :: IO [FilePath] -> [IO FilePath]

我非常怀疑我所遵循的方法是不可能的,因为它似乎需要逃避IO Monad,所以我要问的是:

  1. 这种方法是否可行,如果是这样,我错过了什么?
  2. 如果没有,你会如何解决这个问题?在所有测试用例中避免硬编码一定很常见

1 个答案:

答案 0 :(得分:4)

通常如果你在参数中得到IO a个值,那么你可能做错了。 testMyLexermyTest都可以是纯粹的,因此不是

testMyLexer :: IO FilePath -> Assertion
myTest :: [IO FilePath] -> Test

DO

testMyLexer :: FilePath -> Assertion
myTest :: [FilePath] -> Test

然后,只需使用getTestFiles中的绑定来提取[FilePath]

do
    files <- getTestFiles
    runTestTT $ myTest files