2017-12-15 27 views
0

그래서 로컬 캐시 구현을 위해 ScalaTest/ScalaCheck를 사용하여 Scala UnitTest를 만들고 있는데, 이미 본 ID로 이벤트가 들어 오면 완전히 새로운 값을 생성하는 대신 해당 값을 업데이트하는 기능을 테스트해야합니다. 캐시의 항목.ScalaCheck forAll을 사용하여 케이스 클래스의 매개 변수 하나를 설정하고 나머지를 임의로 생성하도록하려면 어떻게해야합니까?

이제 루프의 반복마다 동일한 ID가 생성되도록하는 방법을 확실히 알았습니다. 아래 코드를 참조하십시오.

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

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

     cacheUnderTest.records should have size 1 
} 

나머지 일치하지 않는 이벤트가 재생성되는 동안 expectedId가 항상 동일하게 유지되도록하려면 어떻게해야합니까? 내가 수업 ClientFacingExecution의 전체 정의를 알 수 없기 때문에

답변

1

, 예를 들어, 고정 ID로 기록 등의 경우 클래스에 대한 발전기를 만들려면

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

로 정의 유사한 경우 클래스 레코드를 고려 ,

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

이 방법을 사용하면 ID가 고정되어 작동 할 수 있지만 클래스의 다른 필드를 생성해야하는 경우 유연성이 부족합니다. 약간 더 정교하고 유연한 접근 방식을 통해 발전기를 새로운 방식으로 결합 할 수 있습니다.

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 
} 

여기서 우리는 forAll의 첫 번째 인수로 제너레이터를 제공합니다. forAll의 두 번째 인수는 첫 번째 인수로 제공된 생성기에서 생성 된 값을 받아들이는 함수입니다.

zip 메서드 (때로는 연결자라고도 함)는 생성자를 결합합니다. 이 경우 우리는 id가 Integer.MIN_VALUE에서 Integer.MAX_VALUE까지의 임의의 값이 될 수있는 임의의 레코드에 대해 생성자를 결합한 다음 해당 값을 Gen.const로 더 제한된 값으로 덮어 씁니다. 이 구조는 코드를 크게 변경하지 않고 Gen.conose 대신 Gen.choose (0,100)를 사용하여 0에서 100 사이의 임의의 ID를 생성하면 다른 방식으로 값을 제한하는 데 사용할 수 있다는 점에서 유연합니다 .