2016-06-01 24 views
5

varsayalım bu sınıf var:Testi geçerli durum geçişleri

case class Receipt(id: Long, state: String) { 
    def transitionTo(newState: String) = { 
    if (!canTransitionTo(newState)) { 
     throw new IllegalStateExcetion(s"cant transition from $state to $newState") 
    } 
    this.copy(state = newState) 
    } 
} 

Ben scalachecks Komutlarıyla canTransitionTo mantığı (değil basitlik uğruna buraya dahil) test etmek isterdim ama yaşıyorum Nasıl başlayacağınız konusunda biraz sıkıntı. Herhangi bir fikir?

cevap

1

some tutorials durum makineleri bu çerçeveyle nasıl test edilir, ancak başka bir özelliği test ederler. Genellikle her geçerli geçiş için bir Command oluşturur ve bunların rasgele kombinasyonlarını yapmak için scalacheck numaralı yangını kullanırlar. Bu özelliğin amacı, durum makinesinin, herhangi bir sayıda geçerli geçiş için normal şekilde davrandığını doğrulamaktır.

Bu yaklaşım, tüm geçişlerin geçerli olduğunu varsaydığından, canTransitionTo test etmeyecektir. Herhangi bir devlet çifti arasındaki geçişlerin test edilmesi, geçerli ve geçersiz geçişler kavramını scalacheck açısından yeniden değerlendirmeyi gerektirecektir. Bu daha orijinal canTransitionTo işlevinden daha karmaşık olabilir.


geçiş setleri biri başka bir oluşturmak için yardımcı olabilir scalacheck diğerinden daha çok küçükse. Örneğin, sadece birkaç geçerli geçiş ve geçersiz onuncu sayısı varsa jeneratörler yardımcı olabilir.

private val allStates: Gen[String] = Gen.oneOf("State1", "State2", "State3") 

private val validTransitions: Set[(String, String)] = Set("State1" -> "State2", "State2" -> "State3", "State3" -> "State1") 
private val validTransitionsGen: Gen[(String, String)] = Gen.oneOf(validTransitions.toSeq) 

private val invalidTransition: Gen[(String, String)] = for { 
    from <- allStates 
    to <- allStates 
    if !validTransitions.contains(from -> to) //this is reimplementaion of canTransitionTo 
} yield from -> to 

property("valid transitions") = forAll(validTransitionsGen) { transition => 
    Receipt(0, transition._1).canTransitionTo(transition._2) 
} 

property("invalid transitions") = forAll(invalidTransition) { transition => 
    !Receipt(0, transition._1).canTransitionTo(transition._2) 
}