2017-12-15 2 views
0

Also ich ein Scala UnitTest mit ScalaTest/ScalaCheck für eine lokale Cache-Implementierung erstellen, und ich muss die Funktionalität testen, dass wenn ein Ereignis mit einer ID kommt, die wir bereits gesehen haben, aktualisiert es diesen Wert, anstatt ein ganz neues erstellen Eintrag im Cache.Mit ScalaCheck forAll, wie setze ich einen Parameter der Fallklasse und lassen Sie den Rest beliebig erzeugt werden?

Ich bin mir jetzt sicher, wie dies zu tun, so dass die gleiche ID für jede Iteration der Schleife generiert wird. Siehe Code unten.

forAll { arbitraryEvent: ClientFacingExecution => 
     val unmatchedEvent = ClientFacingExecutionEnriched(arbitraryFoExec) 
     val expectedId = unmatchedEvent.clientFacingExecution.id 

     ........................................ 
     ........................................ 
     ........................................ 

     cacheUnderTest.records should have size 1 
} 

Wie kann ich sicherstellen, dass expectedId wird immer das gleiche sein, während der Rest des unmatchedEvent regeneriert werden.

Antwort

1

Da ich weiß nicht, die vollständige Definition der Klasse ClientFacingExecution, einen analogen Fall Klasse Rekord als

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

definiert betrachten, um einen Generator für einen Fall Klasse wie Rekord mit einer festen ID zu erstellen, zum Beispiel

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

Dieser Ansatz wird die ID gewährleisten ist festgelegt und kann für Sie arbeiten, aber es fehlt die Flexibilität sollten Sie andere Felder der Klasse generieren möchten. Ein etwas ausgeklügelterer und flexiblerer Ansatz erlaubt es Ihnen, Generatoren auf neue Art zu kombinieren.

val someId = 1 
val recordGenerator:Gen[Record] = Gen.zip(Gen.resultOf(Record), Gen.const(someId)).map{ case (record, id) => record.copy(id = id) } 

forall(recordGenerator){ record: Record => 
... 
cacheUnderTest.records should have size 1 
} 

Hier liefern wir den Generator als erstes Argument für forAll. Das zweite Argument für forAll ist eine Funktion, die einen generierten Wert vom Generator als erstes Argument akzeptiert.

Die zip-Methode, manchmal auch Kombinator genannt, kombiniert Generatoren. In diesem Fall kombinieren wir einen Generator für einen beliebigen Datensatz, wobei die ID ein beliebiger Wert von Integer.MIN_VALUE bis Integer.MAX_VALUE sein kann und überschreiben dann diesen Wert mit Gen.const. Dieses Konstrukt ist insofern flexibel, als Sie Werte auf andere Weise einschränken können, wenn Sie ohne drastische Änderung des Codes wählen, indem Sie Gen.choose (0,100) anstelle von Gen.const verwenden, um beliebige IDs im Bereich von 0 bis 100 zu generieren

Verwandte Themen