使用ScalaCheck forAll,如何设置case类的一个参数并让其余参数随意生成?

时间:2017-12-15 10:32:12

标签: scala unit-testing scalatest scalacheck

所以我使用ScalaTest / ScalaCheck创建一个Scala UnitTest用于本地缓存实现,我需要测试一个功能,如果一个事件带有我们已经看过的ID,它会更新该值而不是创建一个整体缓存中的新条目。

我现在确定如何执行此操作,以便为循环的每次迭代生成相同的id。 请参阅下面的代码。

npm install react-native-deprecated-custom-components --save

如何确保在重新生成其余的unmatchedEvent时,expectedId将始终保持不变。

1 个答案:

答案 0 :(得分:1)

由于我不知道您的类ClientFacingExecution的完整定义,请考虑一个类似的案例类Record定义为

core decoder error: buffer deadlock prevented

为案例类创建生成器,例如具有固定ID的Record,例如

case class Record(id: Int, str: String)

这种方法可以确保修复ID并且可能对您有用,但如果您想要生成类的其他字段,则它缺乏灵活性。稍微复杂和灵活的方法允许您以新的方式组合发电机。

val someId = 1
val simpleRecordGenerator:Gen[Record] = Gen.resultOf(Record).map(_.copy(id = someId))

这里我们提供生成器作为forAll的第一个参数。 forAll的第二个参数是一个函数,它接受来自作为第一个参数提供的生成器的生成值。

zip方法(有时称为组合器)结合了生成器。在这种情况下,我们将一个生成器组合成一个任意记录,其中id可以是从Integer.MIN_VALUE到Integer.MAX_VALUE的任何值,然后使用Gen.const覆盖该值是一个更受约束的值。这个结构很灵活,你可以用它来以其他方式约束值,如果你选择没有大幅改变代码,比如使用Gen.choose(0,100)代替Gen.const来生成0到100范围内的任意id