0

我有一个词法分析器,并希望针对一组已知的良好测试用例对其进行测试。它们保存在子目录./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. 如果没有,你将如何解决这个问题?在所有测试用例中避免硬编码一定很常见
4

1 回答 1

4

通常,如果您IO a在参数中获得包装值,那么您可能做错了什么。两者testMyLexermyTest都可以是纯的,所以而不是

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

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

然后只需使用 bind fromgetTestFiles来提取您的[FilePath]

do
    files <- getTestFiles
    runTestTT $ myTest files
于 2013-05-08T18:21:16.263 回答