2017-09-27 3 views
0

스칼라 테스트를 사용하여 두 목록 목록을 비교하려면 어떻게합니까?스칼라 테스트를 사용하여 중첩 목록 비교

val actual = Array(Row("1", "2"), Row("3", "4")) 
val fail_expected = Array(Row("1", "2"), Row("3", "2")) 
val pass_expected = Array(Row("3", "4"), Row("1", "2")) 

내가

actual should contain theSameElementsAs pass_expected 

으로 시도했지만 그것이 작동하지 않습니다, 그것은 그들이 실제로 같은 경우 두 배열이 서로 다른 것을 말한다.

나는 스칼라 테스트와 함께 funsuite를 사용하고 있습니다.

+0

즉'발 실제 = 목록 (행 ("1", "2"), 행을 목록에 배열로 변환 ("3" , "4"))' –

답변

1

working with containers을 참조하십시오.

case class Row(elems: String*) 
  • : 그것을 경우 클래스를 만들 단순히

    class Row(val elems: String*) { 
    
        def canEqual(other: Any): Boolean = other.isInstanceOf[Row] 
    
        override def equals(other: Any): Boolean = other match { 
         case that: Row => 
         (that canEqual this) && 
          elems == that.elems 
         case _ => false 
        } 
    
        override def hashCode(): Int = { 
         val state = Seq(elems) 
         state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b) 
        } 
    } 
    object Row { 
        def apply(elems: String*) = new Row(elems: _*) 
    } 
    

    나 : 같은

    • 표준 스칼라 방법 : 다음 중 한 가지 방법으로 클래스 즉, 요소의 평등을 구현해야

      또는 암시 적으로 Equality[Row] 구현을 제공하십시오.

      import org.scalactic.Equality 
      implicit object RowEquals extends Equality[Row] { 
          override def areEqual(a: Row, b: Any): Boolean = b match { 
           case r: Row => a.elems == r.elems 
           case _ => false 
          } 
      } 
      
  • 0

    신속하지만 최선의 해결책은 배열을 문자열로 변환하는 것이 아닙니다. 즉

    : 당신은 mkstring 방법을 사용하여 달성 할 수

    actual.mkstring(",") == pass_expected.mkstring(",")