Настройте равенство с помощью самого лучшего - PullRequest
0 голосов
/ 01 апреля 2020

Я хотел бы сделать очень простой пример, демонстрирующий, как настроить равенство при использовании равного сопоставителя для числа:

(29.0001) should equal (29.0) (+-0.0002)

Я знаю, что вы можете использовать проверку диапазона непосредственно для такого рода вещей, но это это то, что я хотел показать. Открыт к другому предложению для показа простого однострочника для настройки равенства.

Большое спасибо

Ответы [ 3 ]

0 голосов
/ 01 апреля 2020

Спички Скалачека не так хороши. Вы можете создать свой собственный, почти единственный в своем наборе тестов.

implicit class ShouldDeltaEqaulsOps(val d: Double) extends AnyVal {
  def shouldIntervalEqual(d1: Double)(eps: range): Unit := {
    // range check
    d1 + eps > d && d > d1 - eps shouldBe true. 
  }
}
0 голосов
/ 01 апреля 2020

Используя черту Explicitly, мы можем встроить настройку равенства, например,

actual should equal (expected) (decided by aCustomEquality)

, например,

import org.scalactic.Explicitly
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalactic.Explicitly._

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

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

    actual should equal (expected) (decided by ((a: User, b: Any) => b match { case User(name, _) => a.name == name; case _ => false }))
  }
}
0 голосов
/ 01 апреля 2020

Извлечение из документации :

Один из хороших способов организации пользовательских сопоставителей - поместить их в одну или несколько черт, которые затем можно смешать в комплекты, которые в них нуждаются. Вот пример:

import org.scalatest._
import matchers._

trait CustomMatchers {

  class FileEndsWithExtensionMatcher(expectedExtension: String) extends Matcher[java.io.File] {

    def apply(left: java.io.File) = {
      val name = left.getName
      MatchResult(
        name.endsWith(expectedExtension),
        s"""File $name did not end with extension "$expectedExtension"""",
        s"""File $name ended with extension "$expectedExtension""""
      )
    }
  }

  def endWithExtension(expectedExtension: String) = new FileEndsWithExtensionMatcher(expectedExtension)
}

// Make them easy to import with:
// import CustomMatchers._
object CustomMatchers extends CustomMatchers

Затем вы можете написать

import org.scalatest._
import Matchers._
import java.io.File
import CustomMatchers._

new File("essay.text") should endWithExtension ("txt")
...