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モナドをエスケープする必要があるように見えるため、私が従っているアプローチは不可能であると強く疑っています。

  1. このアプローチは実行可能ですか?もしそうなら、何が欠けていますか?
  2. そうでない場合、この問題をどのように解決しますか? すべてのテストケースでハードコーディングを避けることはかなり一般的です
4

1 に答える 1

4

通常IO a、引数でラップされた値を取得する場合は、おそらく何か間違ったことをしている可能性があります。との両方testMyLexermyTest純粋にすることができるので、代わりに

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

行う

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

次に、 bind from を使用しgetTestFilesて を抽出するだけ[FilePath]です:

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