2017-11-26 14 views
0

私はScala with Catsを読んでいました。本の最初の章では、Eqの使い方を説明しています。cat `Eq`の` === `Scalatestで

練習の1つは、2つのの等価性を検証するためのその型クラスのインスタンスを書くことです。このことを考えてみましょう:

モデル

final case class Cat(name: String, age: Int, color: String)

型クラスのインスタンス

import cats.Eq 
import cats.syntax.eq._ 
import cats.instances.string._ 
import cats.instances.int._ 
import co.alejandrome.typeclass.model.Cat 

object CatsEqInstances { 

    implicit val catsEq: Eq[Cat] = Eq.instance[Cat] { 
    (cata, catb) => 
     cata.color === catb.color && cata.age === catb.age && cata.name === catb.name 
    } 

} 

ユニットは

import co.alejandrome.typeclass.model.Cat 
import org.scalatest.{FlatSpec, Matchers} 
import cats.instances.option._ 

class EqTest extends FlatSpec with Matchers{ 

    import CatsEqInstances._ 

    "Eq" should "compare two cats" in { 
    val cat1 = Cat("Garfield", 38, "orange and black") 
    val cat2 = Cat("Heathcliff", 33, "orange and black") 

    catsEq.eqv(cat1, cat2) shouldBe false 

    val cat3 = Cat("Garfield", 38, "orange and black") 

    catsEq.eqv(cat1, cat3) shouldBe true 
    } 

    it should "compare two Optional cats" in { 
    val cat1 = Cat("Garfield", 38, "orange and black") 
    //val cat2 = Cat("Heathcliff", 33, "orange and black") 

    val optionCat1 = Option(cat1) 
    val optionCat2 = Option.empty[Cat] 

    optionCat1 === optionCat2 
    } 

} 
テスト

最初のテストは正常に動作しますが、===演算子がスカラテストのものであり、Eqでないため、2番目のテストはうまく動作しません。

typeclassに構文や暗黙的な説明がありますが、何も見つかりませんでした。私はに基づいて、このための解決策があると見ましたが、これは猫自身の単体テストのためのものです。this PR

私はEqSyntax形質に突っついたが、私は=== scalatest独自の実装をオーバーライドするためにどのようにそれを把握することはできません。

これを行う方法はありますか?それともこれはまだ実装されていないのですか?

おかげ

答えて

1

は私が私が正しくあなたの問題を理解してかどうかわからないんだけど、あなたは参照PRに基づか自身のテストのために実装するもの猫を再利用することができますように見えます。ただ、

class EqTest extends FlatSpec with Matchers with cats.tests.StrictCatsEquality { 

にあなたのテストクラスの定義を変更して、あなたは、このような

optionCat1 === optionCat2 shouldBe false 

または

optionCat1 should !== (optionCat2) 

としてテストを書くことができますし、それがインポートされている場合、彼らはあなたが(あなたのEq[Cat]定義を使用しますスコープに入れる)。

本質的に、ScalaTest ===は、CanEqualなどの暗黙的なものを使用しています。したがって、暗黙的な実装を提供(インポート)する場合、===が内部でどのように動作するかを変更することができます。

+0

これは私が欲しかったものです!私はそのクラスを見てきましたが(StrictCatsEquality')、それは見えません。これはうまくいきますが、これは動作しますが、参照されているクラスは猫自身のために多く使用されているように見えるため、これは猫の将来の機能(Scalatestでこの動作をオーバーライドするための何らかの暗黙的/特質を提供する)です。 –