You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:15:33