定义一个简单的隐式任意

时间:2012-04-03 10:55:01

标签: unit-testing scala generator implicit scalacheck

我有一个类型Foo,其构造函数带有Int。如何为implicit定义Arbitrary Foo与scalacheck一起使用?

implicit def arbFoo: Arbitrary[Foo] = ???

我想出了以下解决方案,但是根据我的口味,它有点过于“手动”和低级别:

val fooGen = for (i <- Gen.choose(Int.MinValue, Int.MaxValue)) yield new Foo(i)

implicit def arbFoo: Arbitrary[Foo] = Arbitrary(fooGen)

理想情况下,我需要一个更高阶的函数,我只需要插入一个Int => Foo函数。


我设法将其缩减为:

implicit def arbFoo = Arbitrary(Gen.resultOf((i: Int) => new Foo(i)))

但我仍然觉得必须有一个稍微简单的方法。

1 个答案:

答案 0 :(得分:2)

好吧,您可以使用下划线表示法而不是定义整个Foo - 创建函数(i: Int) => new Foo(i))

class Foo(i: Int)

(1 to 3).map(new Foo(_))

这很有效,因为Scala知道Foo需要Intmap映射Int,所以不需要明确拼写它。

所以这有点短:

implicit def arbFoo = Arbitrary(Gen.resultOf(new Foo(_)))