2017-04-17 202 views
1

有没有办法使用ScalaCheck生成伪造的数据库数据?例如,如果我将数据库模式定义抽入ScalaCheck,有没有一种方法可以生成我需要测试每个模型的测试?有没有办法保持参照完整性?使用ScalaCheck生成数据库数据

+1

AFAIK你必须自己创建发电机。可能你可以使用反射/宏创建一个通用函数 – pedrorijo91

回答

1

您需要手动为模型创建生成器。您可以为生成器中的任何对象和类创建任意实例。例如:

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并跳过手动定义。