假设我有一个名为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
窗外?
答案 0 :(得分:4)
在测试套件中,创建一个包装Bar
的新类型,并为新类型定义Arbitrary
实例。
答案 1 :(得分:3)
尝试ghc -Wall -Werror -Wno-orphans
测试模块。
不完美,因为它会禁用其他孤儿实例的警告,但我相信它是我们目前最接近的。
在下一行"中抑制此警告" pragma也不错。
答案 2 :(得分:1)
您可以在编译测试套件时有条件地定义TESTING
CPP宏。这可以让你避免孤儿,但只在你使用它时才会产生依赖。您可以在containers
包中看到类似的这种宏的使用,但该包当前使用孤立实例用于将Arbitrary
实例添加到测试套件的特定目的。我可能很快就会改变它。