我的Main.hs
文件接受命令行参数:
module Main (toLowerStr, Result(..), grade, main) where
...
grade :: [String] -> String -> String -> (Bool, Result, [Highlight])
grade dictWords correctAnswer studentAnswer =
...
...
main :: IO ()
main = do
args <- getArgs
dict <- readFile $ args !! 0
...
这很好,除非我试着测试。我的测试文件是
module Testing where
import Main
import Test.Hspec
main :: IO ()
main = do
dict <- readFile "dict.txt"
let dictWords = map toLowerStr $ lines dict
hspec $ do
describe "Validate passing answers" $ do
it "Match should be verified exactly" $ do
grade dictWords "house" "house"
`shouldBe` (True, Perfect, [])
然而,当我运行cabal test
时,它仍然会给我
Preprocessing test suite 'tests' for grade-0.1.0.0...
[2 of 2] Compiling Testing ( src/HSpecTests.hs, dist/build/tests/tests-tmp/Testing.o )
Linking dist/build/tests/tests ...
Running 1 test suites...
Test suite tests: RUNNING...
tests: Prelude.(!!): index too large
Test suite tests: FAIL
我确信它之所以失败,是因为在Main.main
中调用了args
,因为可执行文件本身运行良好,而且我看不到!!
在其他任何地方被使用。
如何运行测试?
EDIT:在Main.hs
:中使用模式匹配
main :: IO ()
main = do
[filename, correctString, studentString] <- getArgs
...
现在错误是
[1 of 2] Compiling Main ( src/Main.hs, dist/build/tests/tests-tmp/Main.o )
Linking dist/build/tests/tests ...
Running 1 test suites...
Test suite tests: RUNNING...
tests: user error (Pattern match failure in do expression at src/Main.hs:141:9-48)
Test suite tests: FAIL
编辑2:我的整个grade.cabal
文件
-- Initial grade.cabal generated by cabal init. For further documentation,
-- see http://haskell.org/cabal/users-guide/
name: grade
version: 0.1.0.0
-- synopsis:
-- description:
license-file: LICENSE
author: Amos Ng <amosng@cmu.edu>
maintainer: Amos Ng <amosng@cmu.edu>
-- copyright:
category: Language
build-type: Simple
cabal-version: >=1.8
executable grade
main-is: Main.hs
-- other-modules:
build-depends: base, split ==0.2.*
hs-source-dirs: src
test-suite tests
ghc-options: -Wall
type: exitcode-stdio-1.0
main-is: HSpecTests.hs
other-modules: Main
build-depends: base, split ==0.2.*, hspec ==1.11.*
hs-source-dirs: src
GHC将始终使用名为Main
的模块中名为main的函数作为入口点。由于HSpecTests.hs
是Testing
模块,而不是Main
模块,因此它的main
被完全忽略,而倾向于Main
模块中的main
。您应该将逻辑从Main
模块中分离出来,将Main
模块作为命令行存根。然后,您需要将其从测试构建中排除,并在HSpecTests.hs
中将模块Testing
更改为模块Main
。