2017-04-17 125 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並跳過手動定義。