2017-02-14 7 views
2

Double値は似ていますが、正確ではありません。ケースクラスのリストのScalatest Double相当値

val a: Double = ??? 
val b: Double = ??? 

a shouldEqual b +- 0.25 

をそして、私は1つだけのケースクラスを比較した場合、私はどうなる:通常、私がどうなる

case class Data(label: String, value: Double) 
val a: Data = ??? 
val b: Data = ??? 
a.value shouldEqual b.value +- 0.25 

を私の場合、私はケースクラスのインスタンスのリストを持っている、としたいと思いますもちろん

val output = Seq(Data("a", 1.1), Data("b", 1.2)) 
val expected = Seq(Data("a", 0.9), Data("b", 1.1)) 
output should contain theSameElementsInOrderAs expected 

value属性が完全に一致しないため、ファイルになります。そのvalue属性に対する耐性とそれらを比較します。私に必要なのは、このようなものです:

output should contain theSameElementsInOrderAs expected +- 0.25 

答えて

0

私は私のSeq[Data]タイプのカスタムMatcherを定義することになった:

output should customContainTheSameElementsInOrderAs(expected) 
:その後、私は同じようにそれを使用

trait CustomMatcher { 

    class SeqDataContainsTheSameElementsInOrderAs(expected: Seq[Data]) { 

    override def apply(left: Seq[Data]): MatchResult = { 

     // ... do other checks like comparing the length and such 

     val bad = left.zip(expected).filter(t => { 
     val difference = Math.abs(t._1.value - t._2.value) 
     difference > TOLERANCE // Declare this somewhere 
     }) 

     // Return the MatchResult, you will probably want to give better error messages than this 
     MatchResult(
     bad.isEmpty, 
     s"""Some of the values were not equal""", 
     s"""Everything was equal""" 
    ) 
    } 

    def customContainTheSameElementsInOrderAs(expected: Seq[Data]) = new SeqDataContainsTheSameElementsInOrderAs(expected) 
    } 
} 

0

あなただけの長さが一致しない場合zipが誤って成功するため

zipAllを使用して
forAll(output.zipAll(expected, null, null)) { 
    case (a, b) => a.value shouldEqual b.value +- 0.25 
} 

で行く、しかし、あなたがこの方法のISNを取得し、エラーメッセージ可能性がありあまりにも良い。