声明任意实例时避免构建对 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
实例添加到测试套件的特定目的。我可能会尽快更改。
假设我有一个名为 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
实例添加到测试套件的特定目的。我可能会尽快更改。