找不到模块“ Test.HUnit”

Reb*_*bin 4 haskell haskell-stack

我重新安装了stack和ghci:

$ stack --version
Run Code Online (Sandbox Code Playgroud)
Version 1.6.3, Git revision b27e629b8c4ce369e3b8273f04db193b060000db (5454 commits) x86_64 hpack-0.20.0
Run Code Online (Sandbox Code Playgroud)
$ ghci --version
Run Code Online (Sandbox Code Playgroud)
The Glorious Glasgow Haskell Compilation System, version 8.2.1
Run Code Online (Sandbox Code Playgroud)

我做一个新项目:

$ stack new so-mve
Run Code Online (Sandbox Code Playgroud)
Downloading template "new-template" to create project "so-mve" in so-mve/ 
... blah blah blah ...
Looking for .cabal or package.yaml files to use to init the project.
Using cabal packages:
- so-mve/
Selecting the best among 12 snapshots...
* Matches lts-10.3
Selected resolver: lts-10.3
Initialising configuration using resolver: lts-10.3
Total number of user packages considered: 1
Writing configuration to file: so-mve/stack.yaml
All done.
Run Code Online (Sandbox Code Playgroud)

看起来不错:

$ tree so-mve
Run Code Online (Sandbox Code Playgroud)
so-mve
??? ChangeLog.md
??? LICENSE
??? README.md
??? Setup.hs
??? app
?   ??? Main.hs
??? package.yaml
??? so-mve.cabal
??? src
?   ??? Lib.hs
??? stack.yaml
??? test
    ??? Spec.hs
Run Code Online (Sandbox Code Playgroud)

它生成并运行:

$ cd so-mve
$ stack build
Run Code Online (Sandbox Code Playgroud)
so-mve-0.1.0.0: build (lib + exe)
Preprocessing library for so-mve-0.1.0.0..
Building library for so-mve-0.1.0.0..
Preprocessing executable 'so-mve-exe' for so-mve-0.1.0.0..
Building executable 'so-mve-exe' for so-mve-0.1.0.0..
so-mve-0.1.0.0: copy/register
Installing library in /...blah-blah.../so-mve/.stack-work/install/x86_64-osx/lts-10.3/8.2.2/lib/x86_64-osx-ghc-8.2.2/so-mve-0.1.0.0-5kG2WnHWwo99IiYYGoxrcC
Installing executable so-mve-exe in /...blah-blah.../so-mve/.stack-work/install/x86_64-osx/lts-10.3/8.2.2/bin
Registering library for so-mve-0.1.0.0..
Run Code Online (Sandbox Code Playgroud)
$ stack exec so-mve-exe
Run Code Online (Sandbox Code Playgroud)
someFunc
Run Code Online (Sandbox Code Playgroud)

测试运行:

$ stack test
Run Code Online (Sandbox Code Playgroud)
blah blah blah
[2 of 2] Compiling Main             ( test/Spec.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/so-mve-test/so-mve-test-tmp/Main.o )
...blah-blah-blah...
Progress: 1/2Test suite not yet implemented
so-mve-0.1.0.0: Test suite so-mve-test passed
Completed 2 action(s).
Run Code Online (Sandbox Code Playgroud)

我三重检查HUnit已安装

$ stack install HUnit
Run Code Online (Sandbox Code Playgroud)
Populated index cache.
Run Code Online (Sandbox Code Playgroud)

我加一行 test/Spec.hs

$ cat test/Spec.hs
Run Code Online (Sandbox Code Playgroud)
import Test.HUnit
main :: IO ()
main = putStrLn "Test suite not yet implemented"
Run Code Online (Sandbox Code Playgroud)

不起作用:

$ stack test
Run Code Online (Sandbox Code Playgroud)
so-mve-0.1.0.0: unregistering (components added: test:so-mve-test)
so-mve-0.1.0.0: build (lib + exe + test)
Preprocessing library for so-mve-0.1.0.0..
Building library for so-mve-0.1.0.0..
Preprocessing executable 'so-mve-exe' for so-mve-0.1.0.0..
Building executable 'so-mve-exe' for so-mve-0.1.0.0..
Preprocessing test suite 'so-mve-test' for so-mve-0.1.0.0..
Building test suite 'so-mve-test' for so-mve-0.1.0.0..
[2 of 2] Compiling Main             ( test/Spec.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/so-mve-test/so-mve-test-tmp/Main.o )
Run Code Online (Sandbox Code Playgroud)
/...blah-blah.../so-mve/test/Spec.hs:1:1: error:
    Could not find module ‘Test.HUnit’
    Use -v to see a list of the files searched for.
  |          
1 | import Test.HUnit
  | ^^^^^^^^^^^^^^^^^

Progress: 1/2
--  While building custom Setup.hs for package so-mve-0.1.0.0 using:
      /Users/XXXXXXXX/.stack/setup-exe-cache/x86_64-osx/Cabal-simple_mPHDZzAJ_2.0.1.0_ghc-8.2.2 --builddir=.stack-work/dist/x86_64-osx/Cabal-2.0.1.0 build lib:so-mve exe:so-mve-exe test:so-mve-test --ghc-options " -ddump-hi -ddump-to-file -fdiagnostics-color=always"
    Process exited with code: ExitFailure 1
Run Code Online (Sandbox Code Playgroud)

导入其他库(例如Text.Read和)没有问题Text.Printf。我在附近搜索了一堆,但没有找到答案。对我有什么想法吗?

hne*_*atl 5

您只需要添加HUnit测试项目的依赖项即可。使用时stack,应编辑package.yaml文件以指定依赖关系。特别是,您的测试配置应类似于:

tests:
  so-mve-test:
    main:                Spec.hs
    source-dirs:         test
    ghc-options:
    - ...
    dependencies:
    - HUnit
Run Code Online (Sandbox Code Playgroud)

最新的《堆栈指南》中的“ 添加依赖项 ”部分对此进行了说明。