1. ホーム
  2. scala

[解決済み] ScalaTestでカスタム失敗メッセージを表示するには?

2023-03-03 14:07:11

質問

ScalaTestでカスタム失敗メッセージを表示する方法をご存知の方はいらっしゃいますか?

例えば、以下のような感じです。

NumberOfElements() should equal (5)

失敗したときに以下のようなメッセージを表示します。

10は5と同じではありません。

しかし、私はもっと説明的なメッセージが欲しいのです。

<ブロッククオート

NumberOfElementsは5であるべきです。

どのように解決するのですか?

このような機能を求めているのはあなたが初めてです。これを実現する一つの方法は、withClueを使うことです。のようなものです。

withClue("NumberOfElements: ") { NumberOfElements() should be (5) }

これで、このようなエラーメッセージが表示されるはずです。

NumberOfElements: 10は5と等しくありません

メッセージを完全に制御したい場合は、カスタムマッチャーを書くことができます。あるいは、このようにアサーションを使うこともできます。

assert(NumberOfElements() == 5, "NumberOfElements should be 5")

どのようなユースケースなのか、詳しく教えてください。10が5にならなかったのはなぜか、また、このようなニーズはどの程度の頻度であったのか。

リクエストの種類はこんな感じです。

scala> import org.scalatest.matchers.ShouldMatchers._
import org.scalatest.matchers.ShouldMatchers._

scala> withClue ("Hi:") { 1 + 1 should equal (3) }
org.scalatest.TestFailedException: Hi: 2 did not equal 3
at org.scalatest.matchers.Matchers$class.newTestFailedException(Matchers.scala:150)
at org.scalatest.matchers.ShouldMatchers$.newTestFailedException(ShouldMatchers.scala:2331)


scala> class AssertionHolder(f: => Any) {
     |   def withMessage(s: String) {
     |     withClue(s) { f }
     |   }
     | }
defined class AssertionHolder

scala> implicit def convertAssertion(f: => Any) = new AssertionHolder(f)
convertAssertion: (f: => Any)AssertionHolder

scala> { 1 + 1 should equal (3) } withMessage ("Ho:")
org.scalatest.TestFailedException: Ho: 2 did not equal 3
at org.scalatest.matchers.Matchers$class.newTestFailedException(Matchers.scala:150)
at org.scalatest.matchers.ShouldMatchers$.newTestFailedException(ShouldMatchers.scala:2331)

このように書けばいいんですね。

{ NumberOfElements() should be (5) } withMessage ("NumberOfElements:")