声明任意实例时避免构建对 QuickCheck 的依赖

Avoiding build dependency on QuickCheck when declaring an Arbitrary instance

假设我有一个名为 Foo 的 Haskell 模块,定义在 src/Foo.hs 中。还假设 Foo 导出类型 Bar.

现在我想为 Bar(实际上是为整个 Foo 模块)编写单元测试,所以我将几个 QuickCheck 属性放入 test/FooTest.hs;但是,嘿,现在我需要为 Bar.

定义一个 Arbitrary 实例

还有一个问题:在 -Wall -Werror 模式下,ghc 要求实例声明出现在两个地方之一:在定义类型的同一个文件中,或者 class 被定义。但是我不想让我的 Foo 模块与 QuickCheck 的构建依赖关系混乱,而且我显然不能将 Bar 的实例添加到 QuickCheck。

那么我如何使我的数据类型成为 Arbitrary 的一个实例,仅用于单元测试,而不会为我的模块的用户引入对 QuickCheck 的依赖,也不会将 -Wall -Werror 抛出window?

尝试 ghc -Wall -Werror -Wno-orphans 测试模块。

不完全完美,因为它会禁用对其他孤立实例的警告,但我相信这是我们目前能得到的最接近的。

有一个 "suppress this warning in the next line" pragma 也很好。

在测试套件中,创建一个包装 Bar 的新类型并为新类型定义 Arbitrary 实例。

您可以在编译测试套件时有条件地定义 TESTING CPP 宏。这可以让您避免孤儿,但只会在您使用它时招致依赖。您可以在 containers 包中看到此类宏的类似用法,但该包当前使用孤立实例来将 Arbitrary 实例添加到测试套件的特定目的。我可能会尽快更改。