使用ScalaCheck生成数据库数据
问题描述:
有没有办法使用ScalaCheck生成伪造的数据库数据?例如,如果我将数据库模式定义抽入ScalaCheck,有没有一种方法可以生成我需要测试每个模型的测试?有没有办法保持参照完整性?使用ScalaCheck生成数据库数据
答
您需要手动为模型创建生成器。您可以为生成器中的任何对象和类创建任意实例。例如:
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(...))
但是,如果你正在处理一些realtional数据库,它很有可能会嵌套结构。
case class Fuga(h: Hoge, i: Int)
既然你已经定义了发电机Hoge
,我们可以写一个发电机Fuga
以同样的方式。
val fugaGen: Generator[Fuga] = for {
hGen <- hogeGen
iGen <- arbitrary[Int]
} yield Fuga(hGen, iGen)
您还可以使用霍格的任意情况下,我们使用scalacheck提供的标准的任意整数,arbitrary[Hoge]
而最后一个音符,如果你只用很基本的结构,处理像Hoge
以同样的方式在这个例子中,你可以使用shapeless并跳过手动定义。
AFAIK你必须自己创建发电机。可能你可以使用反射/宏创建一个通用函数 – pedrorijo91