web-dev-qa-db-fra.com

Comment afficher des messages d'échec personnalisés dans ScalaTest?

Quelqu'un sait-il comment afficher un message d'échec personnalisé dans ScalaTest?

Par exemple:

NumberOfElements() should equal (5)

Affiche le message suivant en cas d'échec:

10 n'était pas égal à 5

Mais je veux un message plus descriptif comme:

NumberOfElements devrait être 5.

82
Udayakumar Rayala

Vous êtes le premier à demander une telle fonctionnalité. Une façon d'y parvenir est avec withClue. Quelque chose comme:

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

Cela devrait vous donner ce message d'erreur:

NumberOfElements: 10 n'était pas égal à 5

Si vous souhaitez contrôler complètement le message, vous pouvez écrire un matcher personnalisé. Ou vous pouvez utiliser une assertion, comme ceci:

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

Pouvez-vous préciser quel est votre cas d'utilisation? Pourquoi est-ce que 10 n'est pas égal à 5 ​​n'est pas à la hauteur, et combien de fois avez-vous eu ce besoin?

Voici le genre de chose que vous demandez:

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)

Donc, de cette façon, vous pouvez écrire:

{ NumberOfElements() should be (5) } withMessage ("NumberOfElements:")
91
Bill Venners

Nouvelle façon depuis 2011: Matchers et AppendedClue traits. En outre, pour les tailles de collection, il existe des messages par défaut.

import org.scalatest.{AppendedClues, Matchers, WordSpec}

class SomeTest extends WordSpec with Matchers with AppendedClues {

  "Clues" should {
    "not be appended" when {
      "assertions pass" in {
        "hi" should equal ("hi") withClue "Greetings scala tester!"
      }
    }
    "be appended" when {
      "assertions fail"  in {
        1 + 1 should equal (3) withClue ", not even for large values of 1!"
      }
    }
    "not be needed" when {
      "looking at collection sizes" in {
        val list = List(1, 2, 3)
        list should have size 5
      }
    }
  }
}

La sortie ressemble à ceci:

SomeTest:
Clues
  should not be appended
  - when assertions pass
  should be appended
  - when assertions fail *** FAILED ***
    2 did not equal 3, not even for large values of 1! (SomeTest.scala:15)
  should not be needed
  - when looking at collection sizes *** FAILED ***
    List(1, 2, 3) had size 3 instead of expected size 5 (SomeTest.scala:21)

Notez que le message de taille List n'est pas idéal pour les listes contenant de longs .toString production.

Voir scaladoc pour plus d'informations.

11
tilde

Vous pouvez également utiliser withClue sans importer quoi que ce soit ou l'ajouter à la classe de test:

withClue(s"Expecting distinct elements: ${elements.toList}") { elements.length shouldBe 3 }

Il est importé de la classe Assertions: org.scalatest.Assertions#withClue

2
Shubham Chaudhary