我通常会选择单独的包选项——但我不使用stack test --coverage。感谢您向我介绍它!
(编辑:我可能会这样做,然后仅将测试标志选项用于运行stack test --coverage --flag thepackage:arbitrary,这样其他人就不必处理这些标志了。)
在stack 问题跟踪器上提出--coverage 问题可能也是值得的,因为在这种情况下,覆盖率检查工作会很好。
您要求其他选项 - 最好的可能是测试标志。
测试标志
可以在您的 cabal 文件中定义一个标志(默认为 false),如果选择了该标志,它将仅使用您的 QuickCheck 依赖项构建模块。
将所需的代码放在目录arbitrary 中(例如)。然后将以下等效内容添加到 package.yaml (1st sn-p) 或 the-library.cabal (2nd sn-p) 文件的相关部分:
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 (1st) 或 cabal.project (2nd) 文件中添加以下内容:
flag:
the-library:
arbitrary: true
constraints: the-library +arbitrary
但是有一个小问题......目前该库无法仅在其测试套件中仅依赖+arbitrary 版本,除非它还定义了这样的标志。这可能是值得付出的代价。
注意:我还没有测试下游包装。
Ivan Milenovic's blog 作为初始资源很有用。
DerivingVia/通用实例
可能还有另一种可能性,现在 GHC 8.6 已经发布,DerivingVia。 Blöndal, Löh & Scott (2018) 中有一个针对 Arbitrary 实例的案例研究。
您将创建新类型包装器,并为这些新类型实现 Arbitrary。
按原样,它并不能完全避免这个问题。但是您可以为这些新类型实现Generic,使使用generic-arbitrary 派生的实例与您想要的匹配。
可能还有其他一些选择。特别是,QuickCheck 的依赖关系实际上并没有那么重。还有其他测试库。另外,请注意,已经讨论过将类似Arbitrary 的类型类分离到一个独立的库中。
我也会建议内部库,但这不允许其他包使用您的实例。