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

在哪里定义任意实例?

  •  1
  • dspyz  · 技术社区  · 7 年前

    我不知道该在哪里定义 Arbitrary 在里面 包,那么包不必要地必须有 QuickCheck 在里面 测试之后,其他包就无法使用该实例。如果我把它放在一个单独的测试utils包中,那么测试 必须生活在一个单独的包中,因此它是一个孤立实例,并且 stack test --coverage 不起作用。

    1 回复  |  直到 7 年前
        1
  •  3
  •   David Baynard    7 年前

    我通常会选择单独的包选项,但我不使用 stack test --coverage

    (编辑:我可能会这样做,然后只在运行时使用测试标志选项。) stack test --coverage --flag thepackage:arbitrary 这样就没有其他人需要处理这些旗帜了。)

    这也可能值得一提 --coverage 关于 stack 问题追踪器,因为在这种情况下,覆盖率检查将很好地工作。

    如果您要求其他选项,最好的选项可能是测试标志。

    可以在cabal文件中定义一个标志(默认为false),如果选中该标志,该标志将仅使用QuickCheck依赖项构建模块。

    将所需代码放入目录中 arbitrary package.yaml (第1段)或 the-library.cabal (第二段)文件:

    flags:
      arbitrary:
        description: Compile with arbitrary instances
        default: false
        manual: true
    
    library:
      ⁝
      when:
      - condition: flag(arbitrary)
        dependencies:
        - QuickCheck
        source-dirs:
        - arbitrary
    
    flag arbitrary
      description: Compile with arbitrary instances
      manual: True
      default: False
    
    library
      ⁝
      if flag(arbitrary)
        hs-source-dirs:
          arbitrary
        build-depends:
          QuickCheck
    

    stack.yaml cabal.project (2)档案:

    flag:
      the-library:
        arbitrary: true
    
    constraints: the-library +arbitrary
    

    但有一个小问题,目前该库无法仅依赖 +arbitrary 版本仅在其测试套件中,除非它还定义了这样一个标志。这可能是值得付出的代价。

    注意:我还没有测试下游包装。

    Ivan Milenovic's blog 作为初始资源非常有用。

    现在GHC 8.6已经发布,可能还有另一种可能性,即 DerivingVia Blöndal, Löh & Scott (2018) 对于 Arbitrary 实例。

    武断的 对于那些新类型。

    事实上,这并不能完全避免这个问题。但您可能能够实现 Generic 对于这些新类型,实例可以使用 generic-arbitrary 匹配你想要的。


    可能还有其他选择。特别地, QuickCheck 的依赖性实际上并没有那么重。还有其他的测试库。另外,请注意,已经有一些关于分离 -类似于将typeclass转换为独立库。

    我还建议使用内部库,但这不允许其他包使用您的实例。

    推荐文章