0

我的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

我很确定它失败是因为调用argsin Main.main,因为可执行文件本身工作正常,而且我看不到!!在其他任何地方使用。

如何让测试运行?

编辑:使用的模式匹配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
4

1 回答 1

1

GHC 将始终将名为 main 的函数从名为 的模块中用作入口点Main。由于HSpecTests.hsTesting模块,而不是Main模块,因此它main被完全忽略,而是偏向mainMain模块。您应该将您的逻辑从模块中分离出来,将Main模块保留Main为命令行存根。然后,您需要将其从测试构建中排除,并将模块Testing更改MainHSpecTests.hs.

于 2014-09-14T05:12:02.993 回答