执行cabal test时预期失败的HUnit测试用例却始终通过
问题排查与解决
核心原因:测试未正确关联目标函数
你把findOddInt放在app/Main.hs(可执行文件模块)中,而Cabal默认不允许test-suite直接引用executable内的模块。测试代码里的findOddInt大概率不是你app中返回undefined的那个函数——要么是测试文件自行定义了空实现,要么是导入失败未触发实际执行,导致测试虚假通过。
解决步骤
1. 调整项目结构,迁移业务代码到库模块
新建src/FindOdd.hs文件,将函数移至此处:
module FindOdd where findOddInt :: [Int] -> Int findOddInt = undefined
2. 更新.cabal配置文件
- 添加library目标,关联src目录的业务代码:
library exposed-modules: FindOdd hs-source-dirs: src build-depends: base >=4.14 && <5 default-language: Haskell2010
- 修改executable目标,让其依赖新建的库:
executable your-project-name main-is: Main.hs hs-source-dirs: app build-depends: base >=4.14 && <5, your-project-name default-language: Haskell2010
- 更新test-suite目标,确保依赖库并配置正确:
test-suite your-project-name-test type: exitcode-stdio-1.0 main-is: Spec.hs hs-source-dirs: tests build-depends: base >=4.14 && <5, your-project-name, HUnit default-language: Haskell2010
3. 修正测试代码(tests/Spec.hs)
确保正确导入库模块并编写合法测试用例:
module Main where import FindOdd (findOddInt) import Test.HUnit testFindOdd :: Test testFindOdd = TestCase $ assertEqual "find odd int in list" 3 (findOddInt [0,1,0,1,0]) main :: IO () main = runTestTT testFindOdd >> return ()
4. 重新执行测试
运行以下命令触发测试:
cabal clean cabal configure --enable-tests cabal test
此时测试会因undefined被触发而失败,符合预期。
额外排查点
若问题仍存在,检查:
- 测试文件是否误定义了同名的
findOddInt函数 .cabal中test-suite的源文件路径、模块名是否存在拼写错误- 执行
cabal test --verbose查看详细输出,确认测试是否真实执行、是否有隐藏报错
内容的提问来源于stack exchange,提问作者André Ferreira
相关产品推荐
相关产品推荐

