代码之家  ›  专栏  ›  技术社区  ›  Dref360

将HSpec与堆栈一起使用

  •  4
  • Dref360  · 技术社区  · 9 年前

    我有以下架构:

      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。

    0.0002秒内完成 0个示例,0个失败

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

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

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

    非常感谢。

    1 回复  |  直到 9 年前
        1
  •  4
  •   palik    5 年前

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

    此外,您的规范的模块名称只应不同于附加后缀 Spec 从您的原始模块。中的模块 backendSpec 不会这样做:

    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/Run.hs 属于 hspec-discover )