有没有办法使用ScalaCheck生成伪造的数据库数据?例如,如果我将我的数据库模式定义泵入ScalaCheck,是否有一种方法可以生成我需要测试的每个模型?有没有办法保持参照完整性?
答案 0 :(得分:2)
您需要手动为模型创建生成器。您可以从生成器为任何对象和类创建任意实例。例如:
case class Hoge(a: String, b: Int)
可以轻松生成:
val hogeGen: Generator[Hoge] = for {
aGen <- arbitrary[String]
bGen <- arbitrary[Int]
} yield Hoge(aGen, bGen)
为了在属性测试中自动使用它,您将需要生成器的隐式任意实例。我建议在写这些内容时加入类型以避免问题。
implicit val arbHoge: Arbitrary[Hoge] = Arbitrary(hogeGen)
您也可以跳过生成器步骤,只需编写implicit val arbHoge: Arbitrary[Hoge] = Arbitrary(for { ... } yield Hoge(...))
但如果您正在处理某些实际数据库,那么您可能会拥有嵌套结构。
case class Fuga(h: Hoge, i: Int)
由于您已经为Hoge
定义了生成器,我们可以用同样的方式为Fuga
编写生成器。
val fugaGen: Generator[Fuga] = for {
hGen <- hogeGen
iGen <- arbitrary[Int]
} yield Fuga(hGen, iGen)
您也可以使用Hoge的任意实例,就像我们使用scalacheck中arbitrary[Hoge]
最后一点,如果你只是在这个例子中处理非常基本的结构,如Hoge
,那么你可以使用shapeless并跳过手动定义。