Игнорировать поле в Scalatest Match - PullRequest
0 голосов
/ 13 февраля 2020

Предположим, у меня есть класс дел с несколькими полями и одно сгенерированное как:

case class User(name: String, ...., createdAt: LocalDateTime)

Как я могу проверить равенство без createdAt? Это лучший способ, чем:

val expected = User("username", stubDate)

actual shouldBe expected.copy(createdAt = actual.createdAt)

1 Ответ

5 голосов
/ 13 февраля 2020

Рассмотрим matchPattern примерно так

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class CaseClassPatternMatchSpec extends AnyFlatSpec with Matchers {
  case class User(name: String, age: Int)

  "User" should "be Worf where we ignore the age" in {
    val actual = User("Worf", 30)
    actual should matchPattern { case User("Worf", _) => }
  }
}

или определим пользовательское равенство

import org.scalactic.Equality
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class CaseClassPatternMatchSpec extends AnyFlatSpec with Matchers {
  case class User(name: String, age: Int)
  object User {
    implicit val aEq: Equality[User] = (a: User, b: Any) => b match {
      case User(name, _) => a.name == name
      case _ => false
    }
  }

  "User" should "be Worf where we ignore the age " in {
    val actual = User("Worf", 30)
    val expected = User("Worf", -11)
    actual should === (expected)
  }
}

Обратите внимание только на определенные соответствия можно использовать пользовательское равенство

result should equal (3) // can customize equality
result should === (3)   // can customize equality and enforce type constraints
result shouldEqual 3    // can customize equality, no parentheses required
...