有没有办法使用 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(...))
但是,如果您正在处理一些真实的数据库,您很可能会有嵌套结构。
case class Fuga(h: Hoge, i: Int)
既然你已经为Hoge
定义了生成器,我们可以用同样的方式为Fuga
编写一个生成器。
val fugaGen: Generator[Fuga] = for {
hGen <- hogeGen
iGen <- arbitrary[Int]
} yield Fuga(hGen, iGen)
您还可以使用 Hoge 的任意实例,就像我们通过 arbitrary[Hoge]
最后一点,如果你只处理非常基本的结构,比如本例中的 Hoge
,那么你可以只使用 shapeless并跳过手动定义。
关于database - 使用ScalaCheck生成数据库数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444360/