2017-04-17 1 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) 

また、発電機のステップをスキップし、あなたには、いくつかのrealtionalデータベース、あなたが構造を入れ子にしているだろうと、その可能性を扱っている場合だけimplicit val arbHoge: Arbitrary[Hoge] = Arbitrary(for { ... } yield Hoge(...))

しかしを書くことができます。すでにHoge用発電機を定義しているので

case class Fuga(h: Hoge, i: Int) 

は、我々はFuga同じ方法のための発電機を書くことができます。あなただけHogeのような非常に基本的な構造を扱っている場合にも、我々はarbitrary[Hoge]

そして最後のノートでscalacheckで利用可能な標準任意の整数を使用したのと同じ方法ホーヘの任意のインスタンスを使用することができ

val fugaGen: Generator[Fuga] = for { 
    hGen <- hogeGen 
    iGen <- arbitrary[Int] 
} yield Fuga(hGen, iGen) 

この例では、shapelessを使用し、マニュアル定義をスキップできます。

関連する問題