Использовать генератор ScalaCheck внутри другого генератора - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть генератор, который создает очень сложный объект.Я не могу создать этот объект с помощью чего-то вроде

val myGen = for{
 a <- Gen.choose(-10,10)
 ...
} yield new MyClass(a,b,c,...)

Я попытался создать собственный генератор, подобный этому

val myComplexGen :Gen[ComplexObject] = {

  ...
  val myTempVariable = Gen.choose(-10,10)
  val otherTempVal = Gen.choose(100,2000)

  new MyComplexObject(myTempVariable,otherTempVal,...)
}

, а затем

test("myTest") {
  forAll(myComplexGen){ complexObj => 
        ... // Here, complexObj.myTempVariable is always the same through all the iterations
 }
}

Пока это работает, генерируемые значения всегда одинаковы.Внутренний Gen.choose дает всегда одно и то же значение.

Можно ли как-нибудь написать пользовательский Gen со своей собственной логикой и использовать внутренний Gen.choose внутри, который был бы случайным?

1 Ответ

1 голос
/ 16 апреля 2019

Мне удалось обойти проблему.Решение определенно не элегантное, но это единственный способ, которым я мог бы его решить.

Я преобразовал myComplexGen в def и вызвал его внутри другого поколения с фиктивными переменными

def myComplexGen :ComplexObject = {

  ...
  val myTempVariable = Gen.choose(-10,10)
  val otherTempVal = Gen.choose(100,2000)

  new MyComplexObject(myTempVariable,otherTempVal,...)
}

val realComplexGen :Gen[ComplexObject] = for {
    i <- Gen.choose(0,10) // Not actually used, but for cannot be empty
} yield myComplexGen()

Теперь я могу использовать realComplexGen вforAll и объект действительно случайный.

...