Как утверждать 2 объекта Scala, содержащих список в тесте Scala? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть класс дел, подобный этому.

case class A(a: Int, List[Int])

Now I want to assert two instances of A

val a = A(100, List(2, 4))
val b = A(100, List(4, 2))

a shouldBe b 
a shouldEqual b

Вышеперечисленные операторы не выполняются, потому что List (2, 4) не имеет тот же порядок, что и List (4, 2).

Есть ли способ утверждать целые объекты A, например, a и b, чтобы они проходили?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

Используя Inside микширование, вы можете сделать что-то вроде:

class Spec extends FlatSpec with Matchers with Inside {
  it should "be equal regarding order" in {
    val result = A(100, List(2, 4))

    inside(result) {
      case A(a, list) =>
       a shouldBe 100
       list should contain theSameElementsAs List(4, 2)
    }
  }
}
1 голос
/ 27 сентября 2019

Рассмотрите возможность определения пользовательского равенства , например,

case class A(a: Int, l: List[Int])
object A {
  implicit val aEq: Equality[A] = (a: A, b: Any) => b match {
    case bb: A => bb.a == a.a && bb.l.sorted == a.l.sorted
    case _ => false
  }
}

class ExampleSpec extends FlatSpec with Matchers {
  "As" should "be equal ignoring the order of elements in lists" in {
    val aa = A(100, List(2, 4))
    val bb = A(100, List(4, 2))

    aa should equal (bb)
  }
}

или matchPattern, например,

"As" should "be equal ignoring the order of elements in lists" in {
  case class A(a: Int, l: List[Int])
  val aa = A(100, List(2, 4))
  val bb = A(100, List(4, 3))

  aa should matchPattern { case A(a, l) if bb.a == a && bb.l.sorted == l.sorted => }
}
.
...