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

时间:2016-07-04 20:59:43

标签: unit-testing haskell testing quickcheck build-dependencies

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

现在我想为Bar编写单元测试(实际上是整个Foo模块),所以我将一些QuickCheck属性抛到test/FooTest.hs;但是,嘿,现在我需要为Arbitrary定义Bar个实例。

并且存在问题:在-Wall -Werror模式下,ghc要求实例声明出现在以下两个位置之一:在定义类型的同一文件中,或者在类中被定义为。但是我不想让我的Foo模块混淆QuickCheck上的构建依赖,我显然无法向QuickCheck添加Bar的实例。

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

不完美,因为它会禁用其他孤儿实例的警告,但我相信它是我们目前最接近的。

在下一行"中抑制此警告" pragma也不错。

答案 2 :(得分:1)

您可以在编译测试套件时有条件地定义TESTING CPP宏。这可以让你避免孤儿,但只在你使用它时才会产生依赖。您可以在containers包中看到类似的这种宏的使用,但该包当前使用孤立实例用于将Arbitrary实例添加到测试套件的特定目的。我可能很快就会改变它。