haskell - 将 HSpec 与堆栈结合使用

标签 haskell cabal haskell-stack hspec

我有以下架构:

  backend
  ├── Chat.hs
  ├── Main.hs
  └── Message.hs
  test
  ├── backendSpec
  │   └── MessageSpec.hs
  └── Spec.hs
<小时/>

我的 .cabal 文件包含以下内容

test-suite spec
  build-depends:  base, hspec == 2.*,
                  snap >= 0.14.0.6,
                  containers,
                  aeson,
                  text,
                  transformers,
                  stm,
                  snap-core,
                  snap-server,
                  socket-io,
                  engine-io-snap,
                  snap-cors,
                  bytestring
  hs-source-dirs: test
  main-is: Spec.hs
  Type: exitcode-stdio-1.0

但是当我这样做时

stack test

HSpec 找不到我的测试 int MessageSpec.hs。

Finished in 0.0002 seconds 0 examples, 0 failures

Spec.hs 是正确的输入:{-# OPTIONS_GHC -F -pgmF hspec-discover #-}

我的 MessageSpec 模块正在公开:模块 MessageSpec (main, spec)。

你能帮我找到一种方法让我的堆栈项目完成所有测试吗?

谢谢,

最佳答案

您的规范路径必须遵循模块名称约定。 backendSpec.MessageSpec 不是有效的模块名称,因为它以小写字母开头。

此外,规范的模块名称与原始模块的区别仅在于附加后缀 SpecbackendSpec 中的模块不会遵循以下规则:

module Message where ...
-- vs
module BackendSpec.MessageSpec where ...

因此,要解决此问题,请确保 test 目录中的所有目录均以大写字母开头。但更好的是,确保测试目录与您的 src 目录具有相同结构,因为这将在测试期间产生更好的模块名称:

-- If file is test/BackendSpec/MessageSpec.hs
BackendSpec.Message:
   <someDescription>
      <some assertion>
      <some assertion>
      <some assertion>

对比

-- If file is test/MessageSpec.hs
Message:
   <someDescription>
      <some assertion>
      <some assertion>
      <some assertion>

(该行为的相关代码可以在hspec-discoverhspec/Run.hs中找到)

关于haskell - 将 HSpec 与堆栈结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35005167/

相关文章:

algorithm - Haskell 中的串行理解

Haskell base-4.x 包安装

haskell - 如何清除 cabal 构建中的剩余文件?

haskell - Haskell 中的流数据类型实现

haskell - 如果没有匹配的封闭类型族实例,有没有办法获得编译时错误?

haskell - 如何在阅读时忽略多态可读类型?

haskell - 无法在 Haskell 中安装 accelerate-cuda

emacs - Haskell 与 emacs 组织模式 : Variable not in scope

macos - 为什么 Haskell Stack 在尝试构建我的项目时挂起?