specs2 と scalacheck を連携させるのに苦労しています。Credit1 から 59 の範囲内の単一の整数を取る単純なクラス があります (この範囲外のものは例外をスローする必要があります)。
2 つのテストを定義したいと思いCredit(1)ますCredit(59)。また、Creditその範囲外のものは検証に失敗する必要があります (実際には、構築時に例外をスローする必要があります)。Arbitrary[Credit]次のように、ジェネレーターを定義するのが正しいアプローチのようです。
implicit lazy val arbitraryCreditGenerator: Arbitrary[Credit] = Arbitrary(creditGenerator)
そして、私も定義しarbitraryBadCreditGeneratorます。
問題は、任意の暗黙的な使用でありprop、2 つの異なる任意のインスタンスで使用するための構文を理解しようとしています。
私がこれまでに持っているものは次のとおりです。
case class Credit(amount: Int)
object Credit {
implicit val creditValidator = validator[Credit] { c =>
c.amount should be > 0
c.amount should be < 60
}
}
class TestCreditModel extends Specification with ScalaCheck { def is = s2"""
Given a credit
When validation is performed
Then credits between 1 and 60 should be acceptable ${creditsAreValid}
And credits less than 1 or greater than 60 should not ${creditsAreInvalid}
"""
implicit lazy val arbitraryCreditGenerator: Arbitrary[Credit] = Arbitrary(creditGenerator)
val creditGenerator = Gen.choose(1,59).map(Credit(_))
val badCreditGenerator = (Gen.choose(-500, 500) suchThat (n => n < 1 || n > 59)).map(Credit(_))
def creditsAreValid = prop { (a: Credit) => validate(a).isSuccess must beTrue }
// Err... oops... how do I use my badCreditGenerator???
def creditsAreInvalid = prop { (a: badCreditGenerator) => validate(a).isSuccess must beFalse }
// ^ compile error... not defined
}
Credit検証に Accord を使用しているため、無効な範囲でを作成しようとすると失敗します。
badCreditGenerator私の使用法がすべて間違っているため、これはコンパイルされません。私はそれをいじり、解決策を考え出そうとしています。Credit理想的には、「良い」インスタンスを生成するジェネレータと、悪いインスタンスを生成しようとするジェネレータの 2 つの任意のジェネレータが必要です。
多分もっと良い方法がありますか?
どんな助けでも感謝します。ありがとうございました!